gpt4 book ai didi

用于选择包含一组值的所有组的 SQL 语句

转载 作者:行者123 更新时间:2023-12-03 09:30:22 24 4
gpt4 key购买 nike

在 SQL Server 2005 中,我有一个带有订单 ID 和产品 ID 的订单详细信息表。我想编写一个 sql 语句来查找包含特定订单中所有项目的所有订单。所以,如果订单 5 有项目 1、2 和 3,我希望所有其他订单也有 1、2 和 3。此外,如果订单 5 有 2 次和 3 次,我希望所有其他订单两个 2 和一个 3。

我的偏好是它返回完全匹配的订单,但如果这样更容易/表现更好,那么作为超集的订单是可以接受的。

我尝试了如下所示的自连接,但发现订单包含任何项目而不是所有项目。

SELECT * FROM Order O1
JOIN Order O2 ON (O1.ProductId = O2.ProductId)
WHERE O2.OrderId = 5

如果订单 5 两次包含相同的项目,这也会给我重复。

最佳答案

如果 OrderDetails 表包含对 OrderId 和 ProductId 的唯一约束,那么您可以执行以下操作:

Select ...
From Orders As O
Where Exists (
Select 1
From OrderDetails As OD1
Where OD1.ProductId In(1,2,3)
And OD1.OrderId = O.Id
Group By OD1.OrderId
Having Count(*) = 3
)

如果可以在同一个订单上多次使用相同的 ProductId,那么您可以将 Have 子句更改为 Count(Distinct ProductId) = 3
现在,鉴于上述情况,如果您想要每个订单具有相同签名和重复产品条目的情况,那就更棘手了。为此,您需要对相关产品的相关订单签名,然后查询该签名:
With OrderSignatures As
(
Select O1.Id
, (
Select '|' + Cast(OD1.ProductId As varchar(10))
From OrderDetails As OD1
Where OD1.OrderId = O1.Id
Order By OD1.ProductId
For Xml Path('')
) As Signature
From Orders As O1
)
Select ...
From OrderSignatures As O
Join OrderSignatures As O2
On O2.Signature = O.Signature
And O2.Id <> O.Id
Where O.Id = 5

关于用于选择包含一组值的所有组的 SQL 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3150498/

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