2017-12-20 11 views
0

Es gibt einige Unterschiede in den folgenden zwei Abfragen.Unterschied in where-Klausel - in und nicht 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%') 
        ) 

Abfrage 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%') 

Ich möchte die Quelle der Produkte, deren Produktcodes sind nicht in beiden product_master und CVM enthalten. Ich versuche die obigen 2 Abfragen. Beide liefern unterschiedliche Ergebnismengen. Könnte mir jemand helfen, den Unterschied in beiden Fragen herauszufinden.

Vielen Dank im Voraus!

Antwort

0

Erste Abfrage - finden Sie alle PRODUCT_CODE s, wo (nicht in Kriterien entsprechen) und VERSION_ID Matches bestimmte Kriterien. Suchen Sie dann separat alle Zeilen in der BUDGET Tabelle, die mit diesen PRODUCT_CODE s übereinstimmen, und finden Sie alle eindeutigen Quellen. Insbesondere diese Zeilen sind nicht VERSION_ID eingeschränkt.

Zweite Abfrage - finden Sie alle SOURCE s wo (nicht in Kriterien übereinstimmen) und VERSION_ID bestimmte Kriterien erfüllt. Dies gibt SOURCE Werte für andere Zeilen nicht zurück, die denselben PRODCUT_CODE Wert aber andere VERSION_ID Werte haben.

Welches ist richtig, konnte ich nicht sagen. Wenn wir Beispieldaten und erwartete Ergebnisse und mehr Erklärung Ihres Ziels hatten, kann es sein, dass keine dieser Abfragen derzeit Ihren Erwartungen entspricht.

(Beachten Sie auch, dass DISTINCT in einer IN() Abfrage mit bestenfalls eine Ablenkung für den Optimierer und im schlimmsten Fall ein pessimisation. IN() Lage sein sollte, so schnell zurückzukehren, wie es ein einziges Spiel identifiziert. Wenn Sie Pech haben, der Optimierer wird tatsächlich die Arbeit tun, um sicherzustellen, dass die Ergebnisse eindeutig sind, aber das die Frage nicht beeinflusst, ob eine Übereinstimmung existiert oder nicht)

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]%' 
Verwandte Themen