SQL ALL IN 子句

Sam*_*ved 5 sql sql-server sql-server-2008

我一直在寻找这个,但没有找到任何特别的东西。

是否有可能有一个像 ALL IN 一样的 SQL 查询?为了更好地解释,这是一个表结构。

Orders table
OrderItem table (having several columns, but mainly ProductID, OrderID)
ProductGroup table (several columns, but mainly GroupID and ProductID)
Run Code Online (Sandbox Code Playgroud)

我想编写一个查询,该查询将选择属于特定产品组的所有订单。因此,如果我有一个 ID = 10 的名为“XYZ”的组。其中有一个 ProductID。说 ProductID01

一个订单有两个订单项目。产品 ID01 和产品 ID02。要查找特定产品组中的所有订单,我可以使用一个简单的 SQL,例如

SELECT bvc_OrderItem.ProductID, bvc_OrderItem.OrderID
From bvc_OrderItem
INNER JOIN bvc_Product_Group_Product with (nolock) ON bvc_OrderItem.ProductID = bvc_Product_Group_Product.ProductID 
WHERE bvc_Product_Group_Product.GroupID = 10
Run Code Online (Sandbox Code Playgroud)

或者我可以使用 IN 子句写作

SELECT bvc_OrderItem.ProductID, bvc_OrderItem.OrderID
From bvc_OrderItem
WHERE ProductID IN (
    SELECT ProductID FROM bvc_Product_Group_Product WHERE GroupID=10
)
Run Code Online (Sandbox Code Playgroud)

但是,这将返回一个或多个 ProductID 属于产品组的所有订单。仅当所有订单商品都属于产品组时,我才需要返回订单行

所以基本上,我需要一个 IN 子句,如果 IN 子句中的所有值都与 bvc_OrderItem 中的行匹配,则该子句将被视为匹配。

或者,如果我们正在使用 Join,那么只有当左侧的所有行在相应的右侧表中都有值时,Join 才会成功。

如果我能写得更简单,我会这样写

Select ID FROM Table WHERE ID IN (1, 2, 3, 4)
Run Code Online (Sandbox Code Playgroud)

并且如果表包含 ID 为 1、2、3、4 的所有行;它应该返回成功。如果缺少这些 IN 值中的任何一个,则应返回 false 并且不应选择任何内容。

你认为有可能吗?或者有一种解决方法可以做到这一点?

Gor*_*off 4

您可以通过多种方式获取订单列表,例如:

SELECT oi.OrderID
FROM bvc_OrderItem oi JOIN
     bvc_Product_Group_Product pgp
     ON oi.ProductID = pgp.ProductId AND
        pgp.GroupID = 10
GROUP BY oi.OrderID
HAVING COUNT(DISTINCT oi.ProductID) = (SELECT COUNT(*)
                                       FROM bvc_Product_Group_Product
                                       WHERE GroupID = 10
                                      );
Run Code Online (Sandbox Code Playgroud)

获取特定产品需要额外的join. 在大多数情况下,订单列表更有用。

你的语法的问题ALL IN是它没有达到你想要的效果。您要选择订单。语法:

SELECT bvc_OrderItem.ProductID, bvc_OrderItem.OrderID
From bvc_OrderItem
WHERE ProductID ALL IN (SELECT ProductID
                        FROM bvc_Product_Group_Product
                        WHERE GroupID = 10
                       )
Run Code Online (Sandbox Code Playgroud)

这并不指定您打算按 分组OrderId,而不是按其他级别分组。

但更根本的是,SQL 语言受到关系代数的启发。SELECTJOINWHERE和的构造GROUP BY与关系代数基本构造直接相关。ALL IN尽管有时有用,但可以使用更基本的构建块来表达这一概念。