반응형
예제. 관리자인 사원들의 이름을 출력하시오.
(mgr에 자기 사번이 있는 사원들 = 자기 밑에 직속 부하가 한 명이라도 있는 사원들)
SELECT ename
FROM emp
WHERE empno IN (SELECT mgr FROM emp);
예제. 관리자가 아닌 사원들의 이름을 출력하시오.
(자기 밑에 직속부하가 한명도 없는 일반 사원들)
SELECT ename
FROM emp
WHERE empno NOT IN (SELECT mgr FROM emp);
전체 사원 14명 중에 6명이 관리자면, 8명의 사원이 출력되야 하는데 출력 결과가 없음.
결과가 나오지 않는 이유 파악 :
위와 같은 의미의 코드
SELECT ename
FROM emp
WHERE empno != 7788 AND empno != 7902 AND empno != NULL;
T AND T AND NULL
=> NULL이기 때문에 해당하는 empno를 검색 조건으로 걸러낼 수가 없음/
즉, 선택된 레코드가 없는 이유 : 관리자가 없는 사장 KING의 mgr 값이 null이기 때문.
메인 쿼리로 NULL이 리턴되지 않도록 주의!!
방법1)
SELECT ename
FROM emp
WHERE empno NOT IN (SELECT mgr FROM emp WHERE mgr IS NOT NULL);
IS NOT NULL : null값이 있는 행은 제거하고 mgr을 뽑는 방법
방법2)
SELECT ename
FROM emp
WHERE empno NOT IN (SELECT nvl(mgr, -1)
FROM emp);
-1 : 사원번호가 아닐 것 같은 값을 null값의 대체 값으로 지정해주는 방법
'Oracle DBA > SQL' 카테고리의 다른 글
074 서브 쿼리 사용하기 4(EXISTS와 NOT EXISTS) (0) | 2023.07.05 |
---|---|
추가 : 서브쿼리 사용하기 3 (다중열 서브쿼리) + unpair, pairwise (0) | 2023.07.04 |
072 서브 쿼리 사용하기 2(다중 행 서브쿼리) (0) | 2023.07.04 |
071 서브 쿼리 사용하기 1(단일행 서브쿼리) (0) | 2023.07.04 |
070 집합 연산자로 데이터의 차이를 출력하기(MINUS) (0) | 2023.07.04 |