我正在学习SQL,现在正在学习w3schools教程。我猜他们在ALL关键字上的示例是不正确的,但可能只是我不理解。就是这样
SELECT ProductName
FROM Products
WHERE ProductID = ALL (SELECT ProductID FROM OrderDetails WHERE Quantity = 10);
此代码的解释是
以下SQL语句返回TRUE并列出产品名称,如果 OrderDetails表中的所有记录的数量均为10
据我了解,SELECT向我们返回了所有具有等于10数量的订单的产品ID,因此我们具有ID列表。然后我们应用ALL运算符,但ID不能同时等于所有ID,因此我们得到了一个空列表。这就是我的理解。
我尝试报告他们网站上的错误,但未收到任何答案。 请帮助我理解这一点。
编辑:未指定RDBMS,所以我认为它应该可以正常工作。这是指向示例https://www.w3schools.com/sql/sql_ref_all.asp
的链接答案 0 :(得分:2)
您的解释几乎是正确的。而且网站上的解释只是假的。
但是,查询将返回:
productname
与productid
为10,则为quantity
。productname
,数量为10,则所有productid
。(这假设ProductId
在products
中是唯一的,这是一个合理的假设。)
Here是一个db <>小提琴,对此进行了说明。
很容易忘记ALL
也适用于空列表。因此,任何给定的ProductId
都等于空白列表中的所有ProductId
-甚至是NULL
ProductId
。
答案 1 :(得分:1)
您的声明在本质上是正确的:
SELECT向我们返回订单数量等于的所有产品ID 到10,所以我们有ID列表。然后我们应用ALL运算符但ID 不能同时等于所有ID,所以我们有一个空列表。
第二句话的一个例外是,如果子查询仅返回一行,则ALL
是无关紧要的,应该返回一个乘积。
据我所知,本教程中关于该语句的说法是胡说八道,除非有一些我不熟悉的RDBMS对这种语法的处理方式不同(即不正确)。
除了对ALL
行为的描述外,语句“以下SQL语句返回TRUE”是无意义的。 SQL语句不返回TRUE或FALSE。他们返回行。