SELECT NO ,NM , SORT_ORDR , DEL_YN FROM TABLE WHERE DEL_YN ='N' ORDER BY NO , sort_ordr 이러한 쿼리로 조회하면
1, 이름A, 0 , N
1, 이름A, 1 , N
2, 이름B, 1, N
2, 이름B, 2, N
3, 이름C, 2, N
3, 이름C, 3, N
이렇게 데이터가 있으면
sort_ordr 에 0 또는 1 없는 경우를 찾을려고 합니다. not in 이나 not exist로 잘 안되네요
0과 1 둘 다 없는 경우인 NO가 3번 항목 만 나오게 할려면 어떻게 해야 할까요?
(SORT_ORDR !=0 and SORT_ORDR !=1) 이렇게 조건을 추가하면 쿼리 결과에서 NO 로 검색했을 때 0인 것이 나와서 원하는 쿼리가 아니었습니다.
WITH t AS ( SELECT 1 no, '이름A' nm, 0 sort_ordr, 'N' del_yn FROM dual UNION ALL SELECT 1, '이름A', 1, 'N' FROM dual UNION ALL SELECT 2, '이름B', 1, 'N' FROM dual UNION ALL SELECT 2, '이름B', 2, 'N' FROM dual UNION ALL SELECT 3, '이름C', 2, 'N' FROM dual UNION ALL SELECT 3, '이름C', 3, 'N' FROM dual ) -- Not In -- SELECT * FROM t WHERE del_yn = 'N' AND no NOT IN (SELECT no FROM t WHERE del_yn = 'N' AND sort_ordr IN (0, 1) ) ORDER BY sort_ordr ; -- Not Exists -- SELECT * FROM t a WHERE del_yn = 'N' AND NOT EXISTS (SELECT 1 FROM t b WHERE b.del_yn = 'N' AND b.sort_ordr IN (0, 1) AND b.no = a.no ) ORDER BY sort_ordr ; -- Outer Join & Is Null -- SELECT a.* FROM t a LEFT OUTER JOIN t b ON b.del_yn = 'N' AND b.sort_ordr IN (0, 1) AND b.no = a.no WHERE a.del_yn = 'N' AND b.no IS NULL ORDER BY sort_ordr ; -- 분석함수 -- SELECT no, nm, sort_ordr, del_yn FROM (SELECT no, nm, sort_ordr, del_yn , COUNT(CASE WHEN sort_ordr IN (0, 1) THEN 1 END) OVER(PARTITION BY no) cnt FROM t WHERE del_yn = 'N' ) WHERE cnt = 0 ORDER BY sort_ordr ;
WITH TMP (NO, NM, SORT_ORDR, DEL_YN) AS ( SELECT 1, '이름A', 0, 'N' FROM DUAL UNION ALL SELECT 1, '이름A', 1, 'N' FROM DUAL UNION ALL SELECT 2, '이름B', 1, 'N' FROM DUAL UNION ALL SELECT 2, '이름B', 2, 'N' FROM DUAL UNION ALL SELECT 3, '이름C', 2, 'N' FROM DUAL UNION ALL SELECT 3, '이름C', 3, 'N' FROM DUAL ) SELECT * FROM TMP A WHERE NOT EXISTS (SELECT 'X' FROM TMP B WHERE B.NO = A.NO AND B.SORT_ORDR IN (0, 1) );