2017-12-20 10 views
0

아래의 두 쿼리에는 약간의 차이가 있습니다.where 절의 차이 - in 및 not

에 Query1 :

select distinct source from BUDGET where product_code in 
        (select distinct PRODUCT_CODE from BUDGET where PRODUCT_CODE not in 
           (select distinct PRODUCT_CODE from PRODUCT_MASTER) 
                      and PRODUCT_CODE not in 
           (select distinct PRODUCT_CODE from CVM) 
                      and(VERSION_ID like '17%' 
                      or VERSION_ID like '18%') 
        ) 

질의 2 :

select distinct SOURCE from BUDGET where PRODUCT_CODE not in 
           (select distinct PRODUCT_CODE from PRODUCT_MASTER) 
                    and PRODUCT_CODE not in 
           (select distinct PRODUCT_CODE from CVM) 
                    and(VERSION_ID like '17%' 
                     or VERSION_ID like '18%') 

나는 제품 코드 product_master 및 CVM 모두에 포함되지 않은 제품의 소스를 원한다. 위의 2 가지 쿼리를 시도합니다. 둘 다 다른 결과 집합을 반환합니다. 누군가가 두 검색어의 차이를 파악하는 데 도움을 줄 수 있습니까?

미리 감사드립니다.

답변

0

첫 번째 쿼리 - 모든 (일치하지 기준에서) PRODUCT_CODE들과 VERSION_ID 일치 특정 기준을 찾을 수 있습니다. 그런 다음 개별적으로 PRODUCT_CODE과 일치하는 행을 BUDGET 테이블에 찾고 모든 고유 한 소스를 찾습니다. 특히 이러한 행은 VERSION_ID이 제한되지 않습니다.

두 번째 쿼리 - SOURCE (조건 일치 없음) 및 VERSION_ID (이)가 특정 기준과 일치합니다. 동일한 PRODCUT_CODE 값을 가지지 만 다른 VERSION_ID 값이 다른 행에 대해서는 SOURCE 값을 반환하지 않습니다.

어느 것이 옳은지 말할 수 없습니다. 샘플 데이터와 예상 결과가 있고 설명의 목표가 인 경우 현재이 쿼리 중 어느 것도 사용자의 기대치와 일치하지 않을 수 있습니다.

은 (또한, IN() 쿼리에서 DISTINCT을 사용하여 옵티 마이저에서 가장주의 산만과에서 최악 pessimisation입니다 있습니다. IN() 그것은 하나의 일치를 확인하는 즉시 반환 할 수 있어야합니다. 당신이 운이 있다면, 옵티마이 저는 실제로 결과가 고유하지만 결과가 일치하는지 여부를 확인하기 위해 작업을 수행하지만 일치 여부는입니다.

0
SELECT DISTINCT source FROM BUDGET WHERE 
product_code IN -- NOT IN 
(
    SELECT PRODUCT_CODE FROM PRODUCT_MASTER 
    UNION ALL 
    SELECT PRODUCT_CODE FROM CVM 
) 
AND VERSION_ID like '1[78]%'