오라클 10g

PAIRWISE 서브쿼리

무니버 2010. 12. 2. 19:03

 

 

 

 

 

PAIRWISE 서브쿼리 - 2가지 결과물을 묶어서 쌍으로만들어 처리

                              BD들중 오라클에서만 존재한다.

 

예를통해 확인해보자

 

각부서별로 최대급여를 받는 사람과 최소급여를 받는 사람의
부서번호,사원번호,사원명,급여를 나타내 보는 예제를 해보자 .
단, 간단하게하기위해 SAL의 NULL값은 0 으로 간주해보자.

 

 

 사원번호  이름      직위    연봉     커미션      부서번호   직속상사번호

 

 

방법1> 상관서브쿼리를 이용해보면

 

SELECT M.DEPTNO, M.SANO, M.NAME, M.SAL
FROM TBL_NEWSAWON M
WHERE M.SAL = (SELECT MAX(SAL)
             FROM TBL_NEWSAWON
             WHERE DEPTNO = M.DEPTNO) OR
      M.SAL = (SELECT MIN(SAL)
             FROM TBL_NEWSAWON
             WHERE DEPTNO = M.DEPTNO);


방법2> PAIRWISE 서브쿼리를 이용해보자


SELECT DEPTNO, MAX(SAL)
FROM TBL_NEWSAWON
GROUP BY DEPTNO
UNION
SELECT DEPTNO, MIN(SAL)
FROM TBL_NEWSAWON
GROUP BY DEPTNO;

 

위에서 MAX값과 MIN 값을 구하는 것인데
일단 이 두 결과믈을 테이블을 UNION으로 묶어보자.

이 묶어놓은 결과내에서 우리가 최대최소를 찾는것이라고 볼수 있으므로


SELECT DEPTNO, NAME, SAL
FROM TBL_NEWSAWON
WHERE (DEPTNO,SAL) IN ( SELECT DEPTNO, MAX(SAL)
                        FROM TBL_NEWSAWON
                        GROUP BY DEPTNO
                        UNION
                        SELECT DEPTNO, MIN(SAL)
                        FROM TBL_NEWSAWON
                        GROUP BY DEPTNO);

 

연봉이 NULL 값도 있음을 고려해주면

 

SELECT DEPTNO, NAME, SAL
FROM TBL_NEWSAWON
WHERE (NVL(DEPTNO,-10),SAL) IN ( SELECT NVL(DEPTNO,-10), MAX(SAL)
                        FROM TBL_NEWSAWON
                        GROUP BY DEPTNO
                        UNION
                        SELECT NVL(DEPTNO,-10), MIN(SAL)
                        FROM TBL_NEWSAWON
                        GROUP BY DEPTNO);

                       

참고로 NVL인자값중 -10은 부서번호가 NULL 일경우
어디도 속하지 않는다라는것을 의미하기위해 임의로 넣어준값이다.
(부서번호가 10,20,30,40 중에서만 있음을 기억하자)