UNION(ALL) 합칠 때 컬럼명이 달라도 가능할까?

dragonloly·2025년 2월 17일
0

SQL

목록 보기
10/19

가능하다.

2️⃣ USER_ID 값이 달라도 UNION ALL이 되나?
👉 UNION ALL은 "컬럼 개수 & 데이터 타입"만 맞으면 된다!

UNION은 중복 제거, UNION ALL은 중복 제거 X
USER_ID가 온라인에선 숫자(INT), 오프라인에선 NULL인데 둘 다 같은 NULL 가능
→ NULL은 데이터 타입이 따로 없고, 어떤 타입에도 포함될 수 있음!
✅ 그래서 합칠 수 있어!

3️⃣ DATE_FORMAT()에 별칭(SALES_DATE) 다르게 줘도 되는 이유?
👉 UNION ALL은 "첫 번째 SELECT" 기준으로 컬럼명을 정한다!

예를 들어 아래처럼 되어 있어도 문제없어:

SELECT DATE_FORMAT(ONS.SALES_DATE, '%Y-%m-%d') AS 판매날짜, ...
UNION ALL
SELECT DATE_FORMAT(OFS.SALES_DATE, '%Y-%m-%d') AS 날짜, ...

만약 UNION ALL이나 UNION을 사용했을 때 컬럼 개수와 데이터 타입이 같지만, 서로 다른 의미를 가진 컬럼이 포함된다면? 어떻게 구분할 수 있을까?

1️⃣ 컬럼명이 다르면? (문제 없음!)

SELECT ONS.ORDER_DATE AS SALES_DATE, ONS.PRODUCT_ID, ONS.USER_ID, ONS.SALES_AMOUNT
FROM ONLINE_SALE AS ONS

UNION ALL

SELECT OFS.PURCHASE_DATE AS SALES_DATE, OFS.PRODUCT_ID, NULL AS USER_ID, OFS.SALES_AMOUNT
FROM OFFLINE_SALE AS OFS;

✅ 첫 번째 SELECT에서 SALES_DATE라고 했고,
✅ 두 번째 SELECT에서는 PURCHASE_DATE였지만,
👉 UNION ALL은 첫 번째 SELECT 기준으로 컬럼명을 맞추기 때문에 최종적으로 "SALES_DATE"가 됨.

💡 즉, 컬럼명이 달라도 문제없다! 첫 번째 SELECT 기준으로 자동 정해짐.

🎯 2️⃣ 컬럼명이 같지만 의미가 다르면? (헷갈릴 수 있음)
이게 중요한 포인트야! 만약 컬럼 개수와 데이터 타입이 같은데, 의미가 다른 컬럼이 섞이면?
👉 헷갈릴 수 있음!

SELECT ONS.ORDER_DATE AS DATE, ONS.PRODUCT_ID, ONS.USER_ID, ONS.SALES_AMOUNT
FROM ONLINE_SALE AS ONS

UNION ALL

SELECT OFS.PURCHASE_DATE AS DATE, OFS.PRODUCT_ID, NULL AS USER_ID, OFS.SALES_AMOUNT
FROM OFFLINE_SALE AS OFS;

💡 여기서 ORDER_DATE와 PURCHASE_DATE는 사실 다르게 쓰여야 하는데, 같은 DATE 컬럼으로 묶임.
👉 이러면 분석할 때 "이 날짜가 주문일인지 구매일인지" 헷갈릴 수 있음!

🔥 해결 방법 1: 명확한 별칭을 사용하자!

SELECT ONS.ORDER_DATE AS ORDER_OR_PURCHASE_DATE, ONS.PRODUCT_ID, ONS.USER_ID, ONS.SALES_AMOUNT
FROM ONLINE_SALE AS ONS

UNION ALL

SELECT OFS.PURCHASE_DATE AS ORDER_OR_PURCHASE_DATE, OFS.PRODUCT_ID, NULL AS USER_ID, OFS.SALES_AMOUNT
FROM OFFLINE_SALE AS OFS;

✅ 이렇게 하면 최종 컬럼명은 "ORDER_OR_PURCHASE_DATE"로 정리됨 → 덜 헷갈림!

🔥 해결 방법 2: 소스(Source) 컬럼 추가하기
ONLINE_SALE인지 OFFLINE_SALE인지 구분하려면, 아예 "소스" 컬럼을 추가하면 됨!

SELECT ONS.ORDER_DATE AS SALES_DATE, ONS.PRODUCT_ID, ONS.USER_ID, ONS.SALES_AMOUNT, 'ONLINE' AS SOURCE
FROM ONLINE_SALE AS ONS

UNION ALL

SELECT OFS.PURCHASE_DATE AS SALES_DATE, OFS.PRODUCT_ID, NULL AS USER_ID, OFS.SALES_AMOUNT, 'OFFLINE' AS SOURCE
FROM OFFLINE_SALE AS OFS;

UNION 또는 UNION ALL을 사용할 때, SELECT문의 컬럼 순서는 반드시 같아야 할까?

컬럼 순서가 왜 중요할까?
UNION ALL이나 UNION은 컬럼 개수와 데이터 타입만 맞으면 합칠 수 있어요.
하지만, 각 SELECT문의 컬럼 순서가 다르면 엉뚱한 데이터가 들어갈 수 있어요!

SELECT ONS.ORDER_DATE AS SALES_DATE, ONS.PRODUCT_ID, ONS.USER_ID, ONS.SALES_AMOUNT
FROM ONLINE_SALE AS ONS

UNION ALL

SELECT OFS.PRODUCT_ID, OFS.PURCHASE_DATE AS SALES_DATE, NULL AS USER_ID, OFS.SALES_AMOUNT
FROM OFFLINE_SALE AS OFS;

🚨 문제점

첫 번째 SELECT에서는 ORDER_DATE → PRODUCT_ID → USER_ID → SALES_AMOUNT 순서인데,
두 번째 SELECT에서는 PRODUCT_ID → PURCHASE_DATE → USER_ID → SALES_AMOUNT 순서로 다름!
그럼 PRODUCT_ID가 날짜 컬럼(SALES_DATE)로 들어가고, PURCHASE_DATE가 PRODUCT_ID로 들어가서 데이터가 꼬여버림.

✅ 올바른 예시 (순서 맞춤)

SELECT ONS.ORDER_DATE AS SALES_DATE, ONS.PRODUCT_ID, ONS.USER_ID, ONS.SALES_AMOUNT
FROM ONLINE_SALE AS ONS

UNION ALL

SELECT OFS.PURCHASE_DATE AS SALES_DATE, OFS.PRODUCT_ID, NULL AS USER_ID, OFS.SALES_AMOUNT
FROM OFFLINE_SALE AS OFS;

✔ 각 SELECT문의 컬럼 순서를 동일하게 맞췄음
✔ SALES_DATE → PRODUCT_ID → USER_ID → SALES_AMOUNT 순서가 동일!
✔ 올바르게 합쳐짐!

💡 결론: 컬럼 개수 & 데이터 타입 & 순서까지 맞춰야 한다!
✅ 컬럼 개수는 같아야 함
✅ 컬럼의 데이터 타입도 같아야 함
✅ 컬럼의 순서도 맞춰야 함 (순서가 다르면 데이터가 잘못 매칭됨)

2️⃣ UNION ALL은 첫 번째 SELECT의 컬럼명을 따라간다!
3️⃣ 컬럼 개수 & 데이터 타입만 맞으면 UNION ALL 가능!
4️⃣ 첫 번째 SELECT에서 숫자면, 두 번째 SELECT도 숫자로 맞춰야 한다!

profile
IT기업에서 운영 기획 담당하고 있습니다 : )

0개의 댓글