쿼리문을 짜다가 두 쿼리문을 합치는 방법인 UNION/UNION ALL에 대해 익히고 적용해보았는데 기록에 남겨보려고 한다.
근본적으로 UNION/UNION ALL은 앞에서 말했듯이 두 쿼리문을 합치는 방법 중 하나이다. 하지만 두 개의 차이점은 분명하게 존재한다. 차이점은 아래에 정리해보겠다.
💡 UNION 사용 시 주의점
- 컬럼명이 같아야 한다. (만약 같지 않을 경우, AS 사용해서 동일시 시켜주기)
- 컬럼 별 데이터 타입이 같아야 한다.
그렇다면 어떤 식으로 사용하면 좋을까?
우선,
1. 서비스 관리자가 유저들에게 쿠폰을 지급하려고 하는데 정적쿠폰과 동적쿠폰이 존재한다.
2. 쿠폰함에 지급된 쿠폰의 사용 만료 기간이 3일 남았을 경우 푸시알림 제공을 하려고 한다.
3. 마케팅 수신 동의 "Y", 푸시 알림 동의 "Y"인 계정에 한하여 푸시 알림을 발송하고자 한다.
SELECT tuti.USER_TOKEN_ID
FROM tb_user_info tui, tb_user_token_info tuti, tb_coupon_info tci, tb_coupon_user_info tcui
WHERE tui.USER_ID = tcui.USER_ID
AND tui.USER_ID = tuti.USER_ID
AND tci.COUPON_ID = tcui.COUPON_ID
AND tci.DYNAMIC_USE_AT = 'N'
AND DATE(DATE_ADD(tci.END_DATE, INTERVAL -4 DAY)) = DATE(NOW())
AND tui.MARKETING = 'Y'
AND tui.SNS_NOTI = 'Y'
AND tuti.USE_YN = 'Y'
AND tuti.TOKEN IS NOT NULL
AND tuti.DEVICE_OS IS NOT NULL
AND tui.WITHDRAWAL_AT = 'N'
UNION ALL
SELECT tuti.USER_TOKEN_ID
FROM tb_user_info tui, tb_coupon_info tci, tb_coupon_dynamic_user_info tcdui, tb_user_token_info tuti
WHERE tui.USER_ID = tuti.USER_ID
AND tci.COUPON_ID = tcdui.COUPON_ID
AND tci.DYNAMIC_USE_AT = 'Y'
AND DATE(DATE_ADD(tci.END_DATE, INTERVAL -4 DAY)) = DATE(NOW())
AND tui.MARKETING = 'Y'
AND tui.SNS_NOTI = 'Y'
AND tuti.USE_YN = 'Y'
AND tuti.TOKEN IS NOT NULL
AND tuti.DEVICE_OS IS NOT NULL
AND tui.WITHDRAWAL_AT = 'N'
GROUP BY tuti.USER_TOKEN_ID;
위와 같이 UNION ALL을 사용해서 두 쿼리문을 합쳐서 결과 값을 출력해주었다.