생계/튜닝2019. 11. 1. 15:03

 

A 라는 집합에서 B 테이블의 b1 조합 제외, b2 조합 제외


SELECT *

  FROM A

WHERE ...

   AND NOT (     (A.COL1, A.COL2) IN ( SELECT 

                                                     FROM B

                                                     WHERE ... )

                   OR  (A.COL1, A.COL3) IN ( SELECT 

                                                       FROM B

                                                       WHERE ... )

                  )


위 구조의 문제점


 개발자들은 SQL 에 업무를 그냥 서술하는 경향이 있다. 

 위의 쿼리는 NOT IN 절에 조건을 계속 추가하는 식으로 작성이 되어있어서

A 의 조건을 만족하는 모든 ROW 에 대해서 NOT IN 절을 확인하게 되었있다. 


NOT IN 절을 바꿔보자


AND NOT ((A.COL1, A.COL2, A.COL3) IN ( SELECT B.COL1

                                ,DECODE(RN,1,B.COL2, A.COL2)

                        ,DECODE(RN,1,A.COL3, B.COL3)

                                                        FROM B,

                        ( SELECT ROWNUM RN

                                     FROM ALL_OBJECTS

                           WHERE ROWNUM <=2

                                                                 )BB

                                                         WHERE ... 

                         )

                  )



조건에 따라서 COL1, COL2 또는 COL1,COL3 와 가공의 컬럼 RN 을 만들고 카티션 조인을 한다.


RN=1 인 경우 원본의 첫번째 NOT IN 이 되고 

RN=2 인 경우 원본의 두번째 NOT IN 이 된다. 


EX) RN=1    AND NOT ((A.COL1, A.COL2, A.COL3) IN ( B.COL1, B.COL2, A.COL3 )

    RN=2    AND NOT ((A.COL1, A.COL2, A.COL3) IN ( B.COL1, A.COL2, B.COL3 )


 가 된다. 







반응형
Posted by 돌고래트레이너