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 = 2
与NOT 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)
答案 0 :(得分:8)
考虑出现在多行saleItem
中的产品ID:
quantity
2
quantity
与2
如果同一saleItem
有两个productId
行,且这些行中至少有一行的数量不等于2
,则该行productId
对应的行将从第一个查询中排除。
例如,如果您的saleItem
看起来像这样
saleItemId ProductId Quantity
---------- --------- --------
100 1 2
101 2 3
102 2 2
然后第一个查询将排除productId=2
,而第二个查询将包含它。
答案 1 :(得分:3)
我仍然无法弄清楚数量= 2与NOT的区别(SELECT productID FROM saleItem WHERE quantity&lt;&gt; 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
答案 2 :(得分:1)
让我们假设您的表格包含以下示例数据:
<强>产品:强>
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
注意:我假设quantity
字段没有Not Null
约束。
查询:
SELECT productID FROM saleItem WHERE quantity =2
<强>结果:强>
productID
-----------
1
-----------
2
-----------
1
查询:
SELECT distinct productID FROM saleItem WHERE quantity =2
<强>结果:强>
productID
-----------
1
-----------
2
查询:
SELECT productID FROM saleItem WHERE quantity <> 2 // <> operator won't include rows with quantity having NULL values
<强>结果:强>
productID
------------
1
-----------
3
-----------
1
查询:
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);
<强>结果:强>
productID | productName | listprice
-------------------------------------
2 | B | 200
因此,查询1显示productID
的结果,quantity
只有2
的一个值,即SELECT distinct productName, listPrice
FROM product
WHERE productID IN (1,2,1);
。
查询2:
productID | productName | listprice
-------------------------------------
1 | A | 100
-------------------------------------
2 | B | 200
<强>结果:强>
productID
因此,Query2将返回2
数量为quantity
的信息,但可能也可能没有其他值quantity <> 2
。{/ p>
最后注意:
1) Not IN ( quantity <> 2)
不包含NULL数量的行。但quantity
将包含除2
以外的NULL
的值,包括* 11e604e (HEAD -> master) Some comment
* a50932a Another comment
....
....
* 0d85332 Activities: service <-- dupes below
* 5323616 Activities: setup <--
* e4f5063 Results: fix <--
* 5bf3ec0 Composer: update
| * 0ac0e6b XController Setup (tag: sometag) <-- THIS BRANCH HAS NO NAME
| * a34b800
| * dccbd3b
| * 020b15e Activities: service <-- dupes above
| * f4231cf Activities: setup <--
| * 118536f Results: fix <--
|/
* c42ad6f Some comment
。
希望有所帮助:
答案 3 :(得分:0)
我找不到您提供的两个查询之间的区别。但是,根据您的描述,我猜这是您的第二个查询:
SELECT distinct productName, listPrice FROM product WHERE productID NOT IN ( SELECT productID FROM saleItem WHERE quantity <>2)
也许我错过了某些东西,因为查询看起来应该向我返回相同的结果。我只能想到NULL没有值的解释,因此无法进行比较。有些记录可能有NULL作为数量值。然后这个查询:
SELECT productID FROM saleItem WHERE quantity <>2
不会返回这些记录。
因此在外部查询中,它选择NOT IN
因此,由于具有NULL数量的记录不在内部查询中,因此您将在最终结果中使用它。
简而言之,第二个查询将包含quantity = 2和quantity = NULL的记录。