sql 中的 Any 关键字是否在子查询中使用时给出不同的记录

Does Any keyword in sql gives distinct records when used in a subquery

我在教程网站上查看了“任何”的查询,如下所示:

SELECT ProductName
FROM Products
WHERE ProductID = ANY (SELECT ProductID
                       FROM OrderDetails
                       WHERE Quantity = 10); 

此查询返回 31 行且没有重复项。

在此之后,我尝试使用联接应用相同的查询,但我无法从上述查询中获得结果。

我使用的连接查询:

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:同样的记录出现在内部连接的两个连接查询中(有和没有不同的)。

A join 是与 any(或类似的 all)完全不同的操作。

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

如果 any 运算符的布尔结果对于每个 ProductId 都是 true,则可以返回的最多行数等于 Products 中的行数.

通过连接表,比较 join 运算符的两个输入并输出匹配的行,这意味着如果单个 productIdProducts 输入并且输入来自 Orderdetails 的两行具有相同的 ProductId 值,即 Quantity=10 结果是输出 2 行,每个匹配行输出 1 行。

Hence I want to know - does "ANY" clause produce distinct records?

没有。实际上恰恰相反。被选择的记录是 FROM 子句中的记录。因此,在第一个查询中,Products 中没有重复项。 WHERE 子句永远不会生成重复记录。这不是特别是 ANY 的 属性; INEXISTS 以及任何其他比较操作也是如此。

相反的是 JOIN 确实会产生重复记录。这就是您在第二个查询中看到的。 table OrderDetails 有多个给定产品的行。

请注意 ANY(和 IN)确实实现了一种称为 半连接JOIN。因此,这些运算符的作用与 FROM 子句中的 JOIN 之间存在关系。但是,半连接和反连接不同于 FROM 子句中定义的内连接和外连接。