为什么这些查询语句返回的结果不同?

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)

大家好,我正在查询数据库以回顾本学期的课程,但有些困惑。上面的查询结果与下面的查询结果不同。这是一门入门课程,但我仍然无法弄清楚quantity = 2NOT in (SELECT productID FROM saleItem WHERE quantity <> 2)之间的区别。根据我的语法理解,它们都应该只返回数量为2的结果。如果有人能帮忙,将不胜感激!如果这是格式不良好的问题,我道歉了。
SELECT DISTINCT productName, listPrice 
FROM product 
WHERE productID IN (SELECT productID FROM saleItem WHERE quantity = 2)
4个回答

8
考虑到在“saleItem”中出现多次的产品ID:
- 有些行的“quantity”为“2” - 其他一些行的“quantity”与“2”不同
如果您拥有两个具有相同“productId”的“saleItem”行,并且这些行中至少有一个行的数量不等于“2”,则对应于该“productId”的行将从第一个查询中排除。
例如,如果您的“saleItem”如下所示:
saleItemId ProductId Quantity
---------- --------- --------
       100         1        2
       101         2        3
       102         2        2

第一个查询将排除 productId=2,而第二个查询将包括它。


3
我还是无法理解quantity = 2和NOT in (SELECT productID FROM saleItem WHERE quantity <>2)之间的区别。可能是由于NULL值的存在,您可以使用以下方法进行简单检查:
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

1
假设您的数据表格如下所示:
产品表格:
productID | productName | listprice
-------------------------------------
   1      |      A      |   100
-------------------------------------
   2      |      B      |   200
-------------------------------------
   3      |      C      |   300
-------------------------------------
   4      |      D      |   400

销售物品:
productId | quantity
----------------------
    1     |   2
----------------------
    2     |   2
----------------------
    3     |   5
----------------------
    4     |   Null
----------------------
    1     |    3

注意:我在这里假设quantity字段没有Not Null约束。
查询:
       SELECT  productID FROM saleItem WHERE quantity =2

结果:

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

查询:

       SELECT distinct productID FROM saleItem WHERE quantity =2

Result:

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

Query:

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

Result:

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

Query:

SELECT  distinct productID FROM saleItem WHERE quantity <> 2 

结果:

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

因此,查询1可以转换为:


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

Results:

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

所以,查询1显示了仅具有quantity值为2productID的结果。

查询2:

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

Results:

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

因此,Query2将返回那些productID的信息,其quantity2,但可能还具有其他值的quantity

最后注意:

1)quantity <> 2不包括具有NULL数量的行。但是Not IN ( quantity <> 2)将包括具有2以外的quantity值(包括NULL)的行。

希望能对您有所帮助:


请查看已编辑的答案。如有任何疑问,请随时提出。 - Harshil Doshi
你理解这个概念了吗? - Harshil Doshi

0

我找不到你提供的两个查询之间的区别。然而,根据你的描述,我猜测这是你的第二个查询:

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

也许我错过了什么,因为查询看起来对我来说应该返回相同的结果。我只能想到一个解释,那就是NULL没有值,所以它不能进行比较。有可能有一些记录的quantity的值为NULL。那么这个查询:SELECT productID FROM saleItem WHERE quantity <>2 将不会返回这些记录。

因此,在外部查询中,它选择NOT IN,因此由于具有NULL数量的记录不在内部查询中,因此您将在最终结果中拥有它。

简而言之,第二个查询将具有quantity = 2和quantity = NULL的记录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接