오라클 not exist 관련 쿼리 0 2 944

by 아침이네 [Oracle 기초] oralce [2021.12.03 17:19:46]


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인 것이 나와서 원하는 쿼리가 아니었습니다.

 

by 마농 [2021.12.06 08:30:59]
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
;

 


by 동동동 [2021.12.06 08:32:55]

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)
                  );
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입