by 물개 [Oracle 기초] [2013.12.06 16:52:58]
-- 전 그냥 MAX나 MIN을 더 많이 씁니다. with t as( select '1234' userid, '20130101' fromdd, '20131231' todd, 'Y' useyn from dual union all select '1234' , '20130101' , '20131231', 'Y' from dual union all select '1234' , '20130101' , '20131231', 'Y' from dual union all select '1234' , '20130101' , '20131231', 'Y' from dual union all select '1234' , '20130101' , '20131231', 'Y' from dual union all select '1234' , '20130101' , '20131231', 'Y' from dual union all select '1234' , '20130101' , '20131231', 'Y' from dual union all select '1234' , '20130101' , '20131231', 'Y' from dual ) select MAX(userid) , MIN(userid) from t where userid = '1234' AND TO_CHAR (SYSDATE, 'YYYYMMDD') BETWEEN fromdd AND todd AND useyn = 'Y'
-- 조건컬럼(userid)에 반드시 인덱스가 있어야 하구요. -- 인덱스가 있을 경우 MIN(userid) 하면 실행계획이 first row 로 나옵니다. -- Rownum 과 유사하게 동작한다고 보시면 되구요. -- 어차피 userid 를 조건으로 주기 때문에 GROUP BY userid 는 무의미하다고 보이네요. -- 저는 이런식으로 사용합니다. SELECT m.* , (SELECT NVL(MIN('Y'), 'N') FROM sub s WHERE s.useyn = 'Y' AND TO_CHAR(sysdate, 'yyyymmdd') BETWEEN s.fromdd AND s.todd AND s.userid = m.userid AND ROWNUM <= 1 ) yn FROM main m ;