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번의 결과가 왜 다른건지 이해를 못하겠습니다.
논리적으로 표현을 해보면 이렇게 되지 않을까 합니다.
조건 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)를 만족하지 않기만 해도 되기 때문입니다.