34. SQL - 반복해서 틀리는 것들 (#6) - UNION ALL vs CROSS JOIN (2)

Jason·2026년 1월 22일

SQL

목록 보기
30/47

SQL 내가 틀린 것들 - CROSS JOIN + UNION ALL 편

🔴 내가 틀린 코드

SELECT m.member_id, m.name, g.grade
FROM members m
CROSS JOIN grades g
WHERE m.member_id IS NULL

UNION ALL

SELECT m.member_id, m.name, g.grade   -- ❌ g가 뭔데?
FROM members m
WHERE m.member_id IS NOT NULL

에러 이유: grades 테이블 JOIN 안 했는데 g.grade 썼음!


✅ 정답 코드

SELECT m.member_id, m.name, g.grade
FROM members m
CROSS JOIN grades g
WHERE m.member_id IS NULL

UNION ALL

SELECT m.member_id, m.name, NULL AS grade   -- ✅ NULL로 자리 채우기
FROM members m
WHERE m.member_id IS NOT NULL

💡 핵심 포인트

1. UNION ALL은 컬럼 개수가 똑같아야 한다

  • 첫 번째 SELECT: 3개 (member_id, name, grade)
  • 두 번째 SELECT: 3개 맞춰야 함!

2. 값이 없으면 NULL AS 컬럼명

-- 테이블에서 안 가져올 때
SELECT col1, col2, NULL AS col3

3. 테이블 JOIN 안 했으면 alias 못 씀

-- ❌ grades 테이블 없는데 g.grade 쓰면 에러
FROM members m
WHERE m.member_id IS NOT NULL
... g.grade  -- g가 뭔데?

-- ✅ 그냥 NULL 써야 함
... NULL AS grade

📌 CROSS JOIN + UNION ALL 패턴 정리

상황처리 방법
특정 행만 확장WHERE 조건 + CROSS JOIN
나머지 행 유지별도 SELECT (JOIN 없이)
컬럼 수 맞추기NULL AS 컬럼명
둘 합치기UNION ALL

🎯 채널톡 코테 실전 적용

문제 유형: NULL인 product_id 행에 0, 1, 2 값 넣어서 확장

-- NULL 행 → 확장
SELECT product_id, product_name, code
FROM products
CROSS JOIN status_codes
WHERE product_id IS NULL

UNION ALL

-- NOT NULL 행 → 그대로
SELECT product_id, product_name, NULL AS code
FROM products
WHERE product_id IS NOT NULL

오늘의 교훈: 테이블 안 썼으면 그 테이블 alias도 못 쓴다! 🔥

profile
Data Analyst | Thoughts Become Things. 할 수 있다고 생각하면 할 수 있다. 할 수 없다고 생각하면 할 수 없다. | www.linkedin.com/in/명수-제-7ab843200

0개의 댓글