굳이 WITH 문 사용할 필요는 없죠.
인라인뷰 사용해도 마찬가지 입니다.
문제는 조건절이 2dept 로 자동으로 침투해 주느냐가 관건인죠.
11g 테스트 결과 with 나 inlineview 나 동일하게 침투하는 것 확인되네요.
1 2 3 4 5 6 7 8 | SELECT e.eno , ( SELECT dname FROM ( SELECT dno, dname FROM dept ORDER BY dname) dept1 WHERE dno = e.dno AND ROWNUM = 1 ) x FROM employee e ; |
정렬항목과 추출항목이 동일한 경우 그냥 MIN 을 사용하면 되구요.
정렬항목과 추출항목이 다른 경우엔 다양한 시도를 해볼 수 있겠네요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | -- 1. 집계함수에 KEEP 을 이용 SELECT e.eno , ( SELECT MIN (loc) KEEP(DENSE_RANK FIRST ORDER BY dname) FROM dept WHERE dno = e.dno ) x FROM employee e ; -- 2. 적절한 인덱스(dno, dname)가 존재하는 경우 인덱스 힌트를 이용 SELECT e.eno , ( SELECT /*+ INDEX (dept 인덱스명) */ loc FROM dept WHERE dno = e.dno AND ROWNUM = 1 ORDER BY dname ) x FROM employee e ; |