2017-12-02 7 views
7

Hallo zusammen, ich frage eine Datenbank nach einer Klasse, um die Lektionen aus dem Semester zu rekapitulieren und bin ein bisschen verwirrt. Die obige Abfrage gibt eine andere Anzahl von Ergebnissen als die folgende Abfrage zurück. Es ist ein Einsteigerkurs und ich kann immer noch nicht herausfinden, wie sich quantity = 2 von NOT in (SELECT productID FROM saleItem WHERE quantity <> 2) unterscheidet. Die Art, wie ich die Syntax lese, scheint, dass sie nur eine Menge von 2 zurückgeben sollten. Wenn jemand helfen könnte, würde es sehr geschätzt werden! Wenn das eine schlecht formatierte Frage ist, entschuldige ich mich.Warum liefern diese Abfragen unterschiedliche Ergebnisse?

SELECT DISTINCT productName, listPrice 
FROM product 
WHERE productID IN (SELECT productID FROM saleItem WHERE quantity = 2) 

Antwort

3

Ich kann immer noch nicht herausfinden, wie Menge = 2 unterscheidet sich von nicht in (SELECT ProductID FROM saleItem WHERE Menge <> 2)

Wahrscheinlich NULL-Werte, können Sie einfach es überprüfen könnten, mit:

SELECT distinct productName, listPrice 
FROM product 
WHERE productID NOT IN (SELECT COALESCE(productID,-1) 
         FROM saleItem 
         WHERE quantity <> 2) --assuming that quantity is NOT NULL 
7

Betrachten Produkt-IDs, die in mehreren Reihen von saleItem erscheinen:

  • Einige Zeilen haben würde quantity von 2
  • einigen anderen Reihen haben würde quantity verschieden von 2

Wenn Sie zwei saleItem Zeilen für die gleiche productId und mindestens eine dieser Zeilen hat Menge nicht gleich 2 würde die entsprechende Zeile productId von der ersten Abfrage ausgeschlossen werden.

Zum Beispiel, wenn Ihre saleItem sieht wie folgt aus

saleItemId ProductId Quantity 
---------- --------- -------- 
     100   1  2 
     101   2  3 
     102   2  2 

dann der ersten Abfrage productId=2, während die zweite Abfrage es würde ausschließen würde.

0

Ich kann den Unterschied zwischen den beiden von Ihnen angegebenen Abfragen nicht finden. Jedoch auf der Grundlage Ihrer Beschreibung, ich dies zu raten ist Ihre zweite Abfrage:

SELECT distinct productName, listPrice FROM product WHERE productID NOT IN (SELECT productID FROM saleItem WHERE quantity <>2)

Vielleicht bin verpasst ich auf etwas, weil die Abfrage aussieht wie es die gleichen Ergebnisse zu mir zurückkehren. Ich kann nur an die Erklärung denken, dass NULL keinen Wert hat, also kann es nicht verglichen werden. Es ist möglich, dass einige Datensätze NULL als Wert für die Menge enthalten. Dann wird diese Abfrage: SELECT productID FROM saleItem WHERE quantity <>2 diese Datensätze nicht zurückgeben.

So in der äußeren Abfrage, wählt es NOT IN so da der Datensatz, der NULL Menge hat nicht in inneren Abfrage ist, werden Sie es in Ihrem Endergebnis haben.

Kurz und abschließend wird die zweite Abfrage Datensätze mit Menge = 2 und Menge = NULL haben.

1

Lassen Sie uns Ihre Tabellen mit folgenden Beispieldaten übernehmen:

Produkte:

productID | productName | listprice 
------------------------------------- 
    1  |  A  | 100 
------------------------------------- 
    2  |  B  | 200 
------------------------------------- 
    3  |  C  | 300 
------------------------------------- 
    4  |  D  | 400 

saleItem:

productId | quantity 
---------------------- 
    1  | 2 
---------------------- 
    2  | 2 
---------------------- 
    3  | 5 
---------------------- 
    4  | Null 
---------------------- 
    1  | 3 

Hinweis: Ich habe hier das quantity Feld angenommen hat nicht Not Null Einschränkung.

Abfrage:

 SELECT productID FROM saleItem WHERE quantity =2 

Ergebnis:

productID 
    ----------- 
     1 
    ----------- 
     2 
    ----------- 
     1 

Abfrage:

 SELECT distinct productID FROM saleItem WHERE quantity =2 

Ergebnis:

productID 
    ----------- 
     1 
    ----------- 
     2 

Abfrage:

SELECT productID FROM saleItem WHERE quantity <> 2 // <> operator won't include rows with quantity having NULL values 

Ergebnis:

productID 
    ------------ 
     1 
    ----------- 
     3 
    ----------- 
     1  

Abfrage:

SELECT distinct productID FROM saleItem WHERE quantity <> 2 

Ergebnis:

SELECT distinct productName, listPrice 
FROM product 
WHERE productID IN (1,2,1) 
AND productID NOT in (1,3,1); 

Ergebnisse:

productID 
    ------------ 
     1 
    ----------- 
     3 

Daher Abfrage 1 kann in umgewandelt werden

productID | productName | listprice 
    ------------------------------------- 
     2  |  B  | 200 

So Abfrage 1 zeigt Ergebnisse productID, die nur einen Wert für quantity und das ist 2.

Abfrage 2:

SELECT distinct productName, listPrice 
FROM product 
WHERE productID IN (1,2,1); 

Ergebnisse:

productID | productName | listprice 
    ------------------------------------- 
     1  |  A  | 100 
    ------------------------------------- 
     2  |  B  | 200 

So wird Query2 Info Rückkehr für diejenigen productID die 2 als Menge hat aber kann oder kann nicht andere Werte quantity auch.

Last Hinweis:

1)quantity <> 2 nicht enthalten Zeilen mit NULL Menge. Not IN (quantity <> 2) enthält jedoch Zeilen mit Werten für quantity, die nicht 2 sind, einschließlich NULL.

Hoffe es hilft:

+0

Bitte werfen Sie einen Blick auf die bearbeitete Antwort. Fühlen Sie sich frei, irgendwelche Zweifel zu stellen. –

+0

Haben Sie das Konzept hier verstanden? –

Verwandte Themen