PAIRWISE 서브쿼리
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 중에서만 있음을 기억하자)