Nếu bảng OrderDetails chứa một ràng buộc duy nhất đối với OrderId và ProductId, thì bạn có thể làm như sau:
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
)
Nếu có thể có cùng một ProductId trên cùng một Đơn đặt hàng nhiều lần, thì bạn có thể thay đổi mệnh đề Có thành Count(Distinct ProductId) = 3
Bây giờ, với những điều trên, nếu bạn muốn tình huống mỗi đơn hàng có chữ ký giống nhau với các mục nhập sản phẩm trùng lặp, điều đó khó hơn. Để làm điều đó, bạn sẽ cần chữ ký của đơn đặt hàng đối với các sản phẩm được đề cập và sau đó truy vấn chữ ký đó:
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