EXISTS 어렵습니다. 0 4 1,373

by 밤톨이 [SQL Query] 기초 EXISTS [2020.08.28 09:30:23]


SELECT *
  FROM TEST_1
       INNER JOIN TEST_2
          ON TEST_2.ITEMS = TEST_1.ITEMS
 WHERE 1=1
   AND NOT EXISTS (SELECT 1 FROM CODE_T
                    WHERE CODE_T.CODE = TEST_1.TYPE
                     AND SUBSTR(TEST_2.ITEMS,7,1) IN ('X','Y','Z')
                    )
;

SELECT *
  FROM TEST_1
       INNER JOIN TEST_2
          ON TEST_2.ITEMS = TEST_1.ITEMS
 WHERE 1=1
   AND NOT EXISTS (SELECT 1 FROM CODE_T
                    WHERE CODE_T.CODE = TEST_1.TYPE
                    )
   AND SUBSTR(TEST_2.ITEMS,7,1) NOT IN ('X','Y','Z')
;

1번하고 2번의 결과가 왜 다른건지 이해를 못하겠습니다.

by 우리집아찌 [2020.08.28 10:16:02]

다른것이 문제가 아니고 SQL이 틀리지 않았나요?

 


by 밤톨이 [2020.08.28 10:26:05]

네 ON절이 없어서 추가했습니다. 감사합니다.


by 마농 [2020.08.28 10:26:42]

해당 조건 SUBSTR(TEST_2.ITEMS,7,1) IN ('X','Y','Z') 은
- 1번 쿼리에서는 서브쿼리 결과에 영향을 미치는 조건이고,
- 2번 쿼리에서는 메인쿼리 결과에 영향을 미치는 조건이죠.
예를 들어 생각해 보면
- 2번 쿼리에서는 X,Y,Z 자료가 결과에 절대 나올 수 없지만
- 1번 쿼리에서는 X,Y,Z 자료가 결과에 포함 될 수 있습니다.


by jude oh [2020.08.28 12:57:20]

논리적으로 표현을 해보면 이렇게 되지 않을까 합니다.

조건 A : CODE_T.CODE = TEST_1.TYPE ,

조건 B : SUBSTR(TEST_2.ITEMS,7,1) IN ('X','Y','Z') 라고 하면

첫번째 쿼리(명제)는 ~(A & B)  = ~A | ~ B

두번째 쿼리는 ~A & ~ B

여기서 SUBSTR(TEST_2.ITEMS,7,1) NOT IN ('X','Y','Z') 가  ~ B 인 이유는 

조건 'ON TEST_2.ITEMS = TEST_1.ITEMS' 와 같이 INNER JOIN 이므로 SUBSTR(TEST_2.ITEMS,7,1) 이 NULL인 경우는 발생하지 않기 때문에(전제조건이므로)

즉, SUBSTR(TEST_2.ITEMS,7,1) IN ('X','Y','Z') = 조건 B라고 했을때 SUBSTR(TEST_2.ITEMS,7,1) NOT IN ('X','Y','Z') = ~B와 같아 집니다.

 

결국 '~A | ~B' 와 '~A & ~B' 라는 두 명제는 동치일수 없습니다.

 

1번 쿼리에는 X,Y,Z 조건이 나올수 있는 경우가 발생하는 이유는 조건 A(CODE_T.CODE = TEST_1.TYPE)를 만족하지 않기만 해도 되기 때문입니다.

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