我查看了一个";ANY";来自一个教程网站,类似于:
SELECT ProductName
FROM Products
WHERE ProductID = ANY (SELECT ProductID
FROM OrderDetails
WHERE Quantity = 10);
此查询返回31行,没有重复项。
之后,我尝试使用Joins应用相同的查询,但无法从上面的查询中得到结果。
我使用的加入查询:
SELECT Products.ProductName
FROM Products
LEFT JOIN OrderDetails ON Products.ProductID = OrderDetails.ProductID
WHERE OrderDetails.Quantity = 10
ORDER BY Products.ProductName;
这将返回44行,并包含重复行。
在这个带有ProductName
的联接查询中使用了DISTINCT
之后,我得到了所需的结果。
因此,我想知道——;ANY";子句产生不同的记录?
PS:两个Join查询(有区别和没有区别(中都有相同的记录,内部Join也是。
join
与any
(或类似的all
(的操作完全不同。
any
是一个逻辑运算符,在您的示例中用于确定是否应返回Products
中的每一行。
如果any
运算符的布尔结果为每个ProductId
的true
,则可以返回的最多行数等于Products
中的行数。
通过连接表,对join
运算符的两个输入进行比较,并输出匹配行,这意味着如果从Products
输入单个productId
,并且从Orderdetails
输入的两行具有相同的ProductId
值,即Quantity=10
,则结果是输出2行,每个匹配行1行。
因此我想知道-是否"ANY";子句产生不同的记录?
否。事实恰恰相反。所选择的记录是FROM
子句中的记录。因此,在第一个查询中,Products
中没有重复项。WHERE
子句永远不会生成重复的记录。这不是CCD_ 21的特性;CCD_ 22和CCD_。
相反的是,JOIN
确实会产生重复的记录。这就是您在第二个查询中看到的内容。对于给定的产品,表OrderDetails
具有多行。
注意,ANY
(和IN
(实际上实现了一种类型的JOIN
,称为半联接。因此,这些运算符的作用与FROM
子句中的JOIN
之间存在关系。但是,半联接和反联接不同于FROM
子句中定义的内部联接和外部联接。