2017-12-02 164 views
7
SELECT DISTINCT productName, listPrice 
FROM product 
WHERE productID IN (SELECT productID FROM saleItem WHERE quantity = 2) 
    AND productID NOT IN (SELECT productID FROM saleItem WHERE quantity <> 2) 

Hej wszystkim, szukam bazy danych dla klasy, która podsumuje lekcje z semestru i jestem nieco zdezorientowana. Powyższe zapytanie zwraca inną liczbę wyników niż poniższe zapytanie. Jest to kurs na poziomie podstawowym i nadal nie mogę zrozumieć, jak różni się quantity = 2 od . Sposób, w jaki czytam składnię wydaje się, że powinien on zwrócić tylko 2. Jeśli ktokolwiek mógłby pomóc, byłby ogromnie doceniony! Jeśli to źle sformułowane pytanie, przepraszam.Dlaczego te zapytania zwracają różne wyniki?

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

Odpowiedz

3

Wciąż nie mogę dowiedzieć się, jak ilość = 2 różni się od NOT IN (SELECT ProductID FROM saleItem GDZIE ilość <> 2)

Prawdopodobnie wartości null, można sprawdzić to proste z:

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

Rozważmy identyfikatorów produktów, które pojawiają się w wielu rzędach saleItem:

  • Niektóre wiersze musiałyby quantity z 2
  • niektórych innych wierszy musiałby quantity inny od 2

Jeśli masz dwie saleItem wierszy dla tego samego productId, a co najmniej jeden z tych wierszy zawiera ilość nie równy 2, wiersz odpowiadający tej productId byłby wykluczony z pierwszego zapytania.

Na przykład, jeśli saleItem wygląda następująco

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

następnie pierwsze zapytanie wyklucza productId=2, natomiast drugie zapytanie obejmowałyby go.

0

Nie mogę znaleźć różnicy między dwoma podanymi przez Ciebie zapytaniami. Jednakże, w oparciu o opis, jestem zgadywania to jest twoje drugie zapytanie:

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

Może mi brakuje na coś, ponieważ wygląda na to zapytanie powinno powrócić takie same wyniki do mnie. Mogę tylko pomyśleć, co to jest wyjaśnienie, że NULL nie ma żadnej wartości, więc nie można go porównać. Możliwe, że istnieją pewne rekordy, które mają wartość NULL jako wartość dla ilości. To zapytanie: SELECT productID FROM saleItem WHERE quantity <>2 nie zwróci tych rekordów.

Tak więc w zapytaniu zewnętrznym wybiera NOT IN, ponieważ rekord, który ma wartość NULL, nie znajduje się w wewnętrznej kwerendzie, otrzymasz go w ostatecznym wyniku.

Krótko mówiąc, drugie zapytanie będzie miało zapisy z ilością = 2 i ilością = NULL.

1

Załóżmy tabele z następującymi danymi próbki:

produkty:

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 

Uwaga: mam założyć tutaj quantity pola nie ma Not Null ograniczenie.

Zapytanie:

 SELECT productID FROM saleItem WHERE quantity =2 

Wynik:

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

Zapytanie:

 SELECT distinct productID FROM saleItem WHERE quantity =2 

Wynik:

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

Zapytanie:

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

Wynik:

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

Zapytanie:

SELECT distinct productID FROM saleItem WHERE quantity <> 2 

Wynik:

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

Stąd Query 1 mogą być przekształcone w:

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

Wyniki:

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

Tak Query 1 pokazuje wyniki productID, która ma tylko jedną wartość dla quantity i to jest 2.

Query 2:

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

Wyniki:

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

Więc QUERY2 powróci info dla tych productID kto ma 2 jako ilości, ale mogą lub nie mogą mieć inne wartości quantity także.

ostatnia uwaga:

1)quantity <> 2 nie będzie zawierała wiersze z ilością NULL. Ale Not IN (quantity <> 2) będzie zawierać wiersze, które mają wartość dla quantity inne niż 2, w tym NULL.

Mam nadzieję, że pomoże:

+0

Proszę spojrzeć na zredagowaną odpowiedź. Zapraszam do zadawania jakichkolwiek wątpliwości. –

+0

Czy rozumieli Państwo pojęcie tutaj? –