当在子查询中使用时,sql中的Do Any关键字提供不同的记录



我查看了一个";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也是。

joinany(或类似的all(的操作完全不同。

any是一个逻辑运算符,在您的示例中用于确定是否应返回Products中的每一行。

如果any运算符的布尔结果为每个ProductIdtrue,则可以返回的最多行数等于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子句中定义的内部联接和外部联接。

最新更新