https://school.programmers.co.kr/learn/courses/30/lessons/131537
WITH UNION_TABLE AS (
SELECT
SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM
ONLINE_SALE
WHERE
DATE_FORMAT(SALES_DATE, '%Y-%m') = '2022-03'
UNION
SELECT
SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM
OFFLINE_SALE
WHERE
DATE_FORMAT(SALES_DATE, '%Y-%m') = '2022-03')
SELECT
DATE_FORMAT(SALES_DATE, '%Y-%m-%d') SALES_DATE,
PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM
UNION_TABLE
ORDER BY
SALES_DATE, PRODUCT_ID, USER_ID;
ONLINE_SALE, OFFLINE_SALENULL AS 칼럼을 통해 NULL로 채워진 칼럼을 만들어 칼럼 개수를 동일하게 맞춰줌🔥UNION, UNION ALL, 그리고 칼럼 수 맞추기 (NULL AS)의 활용UNION vs UNION ALLUNIONUNION ALL보다 느림 (중복 제거 작업 수행)SELECT col1 FROM table1
UNION
SELECT col1 FROM table2;
중복 제거 (distinct) 기능이 포함됨
UNION ALLSELECT col1 FROM table1
UNION ALL
SELECT col1 FROM table2;
중복 허용, 빠름. 대부분의 경우
UNION ALL이 적절
NULL AS 활용)UNION하거나 UNION ALL하려면:NULL AS 컬럼명 형태로 만들어서 강제로 칼럼 개수를 맞출 수 있음-- ONLINE_SALE은 USER_ID 포함
SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT FROM ONLINE_SALE
UNION
-- OFFLINE_SALE은 USER_ID 없으므로 NULL로 보정
SELECT SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT FROM OFFLINE_SALE
이렇게 하면
USER_ID가 없는 테이블도UNION대상에 포함될 수 있음
DATE_FORMAT(SALES_DATE, '%Y-%m') = '2022-03'를 각 테이블에서 미리 필터링하면 성능 최적화 가능ORDER BY는 문제 요구 조건에 맞게 다음 우선순위로 설정:SALES_DATE 오름차순PRODUCT_ID 오름차순USER_ID 오름차순 (NULL 먼저 나옴)| 항목 | 설명 |
|---|---|
UNION | 중복 제거, 느림 |
UNION ALL | 중복 유지, 빠름 |
| 칼럼 수 불일치 해결 | NULL AS 컬럼명으로 맞추기 |
| 필터링 위치 | UNION 이전에 WHERE 절로 필터 |
| 정렬 우선순위 | 문제에서 요구하는 기준대로 ORDER BY 사용 |