안녕하세요. 구루비에서 많은 도움을 얻고 있습니다. 감사드립니다.
M_CUS(고객) 와 T_ORD(주문) 테이블은 1:N 관계입니다.
2017년 3월에 주문 이력이 있는 고객 정보를 얻는 것이 목표입니다.
<교재 모범 쿼리>
SELECT T1.CUS_ID ,T1.CUS_NM
,(CASE WHEN
EXISTS(
SELECT *
FROM T_ORD A
WHERE A.CUS_ID = T1.CUS_ID
AND A.ORD_DT >= TO_DATE('20170301','YYYYMMDD')
AND A.ORD_DT < TO_DATE('20170401','YYYYMMDD')
)
THEN 'Y'
ELSE 'N' END) ORD_YN_03
FROM M_CUS T1
ORDER BY 1;
<임의 변경>
SELECT T1.CUS_ID ,T1.CUS_NM
, (
SELECT NVL( MAX('Y'),'N')
FROM T_ORD A
WHERE A.CUS_ID = T1.CUS_ID
AND A.ORD_DT >= TO_DATE('20170301','YYYYMMDD')
AND A.ORD_DT < TO_DATE('20170401','YYYYMMDD')
-- AND ROWNUM <= 1 -- 해당 조건을 붙이는 것이 맞으나
-- 실수로 주석처리 하였더니 위와 다른 결과가 나옴
) "ORD_YN_03"
FROM M_CUS T1
ORDER BY 1;
ROWNUM 라인을 주석을 풀면 원하는 결과가 나오지만,
ROWNUM 라인 주석 해제시 원하는 결과가 나오지 않습니다. (결과가 달라짐)
제가 3시간 이상 생각해 보았을 때는 도저히 차이를 모르겠는데 어떤 이유인지 힌트라도 부탁드려도 될까요...
감사합니다.
WITH m_cus AS ( SELECT 1 cus_id, 'A' cus_nm FROM dual UNION ALL SELECT 2, 'B' FROM dual UNION ALL SELECT 3, 'C' FROM dual UNION ALL SELECT 4, 'D' FROM dual ) , t_ord AS ( SELECT 1 cus_id, DATE '2017-03-01' ord_dt FROM dual UNION ALL SELECT 1, DATE '2017-03-02' FROM dual UNION ALL SELECT 1, DATE '2017-03-03' FROM dual UNION ALL SELECT 2, DATE '2017-03-04' FROM dual UNION ALL SELECT 3, DATE '2017-04-01' FROM dual ) SELECT t1.cus_id , t1.cus_nm , CASE WHEN EXISTS (SELECT * FROM t_ord a WHERE a.cus_id = t1.cus_id AND a.ord_dt >= TO_DATE('20170301', 'yyyymmdd') AND a.ord_dt < TO_DATE('20170401', 'yyyymmdd') ) THEN 'Y' ELSE 'N' END ord_yn_01 , (SELECT NVL(MAX('Y'), 'N') FROM t_ord a WHERE a.cus_id = t1.cus_id AND a.ord_dt >= TO_DATE('20170301', 'yyyymmdd') AND a.ord_dt < TO_DATE('20170401', 'yyyymmdd') ) ord_yn_02 , (SELECT NVL(MAX('Y'), 'N') FROM t_ord a WHERE a.cus_id = t1.cus_id AND a.ord_dt >= TO_DATE('20170301', 'yyyymmdd') AND a.ord_dt < TO_DATE('20170401', 'yyyymmdd') AND ROWNUM <= 1 ) ord_yn_03 FROM m_cus t1 ORDER BY 1 ; -- 결과 동일함 -- 1 A Y Y Y 2 B Y Y Y 3 C N N N 4 D N N N