2017-12-20 14 views
0

以下の2つのクエリには多少の違いがあります。where句の違い - inとnot in

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 sおよびVERSION_IDマッチ一定の基準を見つけます。次に、個別にPRODUCT_CODEに一致するすべての行がBUDGETのテーブルにあり、すべての固有ソースを検索してください。特に、これらの行はVERSION_IDに制限されていません。

第2のクエリ - すべて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]%'