쿼리문 질문 0 2 708

by BadGod [SQL Query] [2021.03.12 10:17:29]


쿼리질문.png (17,809Bytes)

질문: 테이블 2개(TAB1, TAB2)가 있고,
TAB2 테이블의 C1 컬럼에 있는 내용이 TAB1의 C1에 없는 것만 
추출하는 쿼리 부탁드려요.
단, NO는 중복된것은 추출하지 않아요.


아래는 제가 작성한 코드인데, 나오지 말아야 할 놈들도 나오더라구요. 

SELECT a.no,
        a.name,
         a.c1
    FROM tab1 a
    WHERE  a.no 
        IN  
        (
        SELECT  DISTINCT a.no
        FROM  tab2 u 
        WHERE a.c1 NOT LIKE '%'||u.c2||'%'
        AND a.c1 IS NOT NULL
        )
;
 

by 마농 [2021.03.12 10:42:07]

1. 오류 : NOT 의 위치가 틀렸네요.
- 서브쿼리 안쪽 LIKE 앞에 NOT을 붙일게 아니라
- 서브쿼리 바깥쪽 IN 앞에 NOT을 붙여야 합니다.
2. 개선
- LIKE 보다는 INSTR
- DISTINCT 불필요
- a.c1 IS NOT NULL 조건 불필요
3. 다양한 방법
- NOT IN
- NOT EXISTS
- OUTER JOIN & IS NULL
 

-- NOT IN --
SELECT a.no
     , a.name
     , a.c1
  FROM tab1 a
 WHERE a.no NOT IN (SELECT a.no
                      FROM tab2 u 
                     WHERE INSTR(a.c1, u.c2) > 0
                    )
;
-- NOT EXISTS --
SELECT a.no
     , a.name
     , a.c1
  FROM tab1 a
 WHERE NOT EXISTS (SELECT 1
                     FROM tab2 u 
                    WHERE INSTR(a.c1, u.c2) > 0
                   )
;
-- OUTER JOIN & IS NULL
SELECT a.no
     , a.name
     , a.c1
  FROM tab1 a
  LEFT OUTER JOIN tab2 u 
    ON INSTR(a.c1, u.c2) > 0
 WHERE u.c2 IS NULL
;

 


by BadGod [2021.03.12 11:01:08]

마농님의 친절하시고 때론 빈틈없는 답변에 갑사드립니다~

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