gpt4 book ai didi

SQL ALL IN 子句

转载 作者:行者123 更新时间:2023-12-03 03:21:17 31 4
gpt4 key购买 nike

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

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

Orders table
OrderItem table (having several columns, but mainly ProductID, OrderID)
ProductGroup table (several columns, but mainly GroupID and ProductID)

我想编写一个查询来选择属于特定产品组的所有订单。因此,如果我有一个名为“XYZ”且 ID = 10 的组。其中有一个 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

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

SELECT bvc_OrderItem.ProductID, bvc_OrderItem.OrderID
From bvc_OrderItem
WHERE ProductID IN (
SELECT ProductID FROM bvc_Product_Group_Product WHERE GroupID=10
)

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

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

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

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

Select ID FROM Table WHERE ID IN (1, 2, 3, 4)

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

你觉得可能吗?或者有解决方法可以做到这一点?

最佳答案

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

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
);

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

您的 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
)

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

但更根本的是,SQL 语言受到关系代数的启发。 SELECTJOINWHEREGROUP BY 的结构与关系代数基本结构直接相关。 ALL IN 的概念——尽管有时很有用——可以使用更基本的构建 block 来表达。

关于SQL ALL IN 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29490961/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com