Om tabellen OrderDetails innehåller en unik begränsning för OrderId och ProductId, kan du göra något så här:
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
)
Om det är möjligt att ha samma produkt-ID på samma beställning flera gånger, kan du ändra Having-satsen till Count(Distinct ProductId) = 3
Med tanke på ovanstående, om du vill ha situationen där varje beställning har samma signatur med dubbla produktposter, är det svårare. För att göra det skulle du behöva signaturen för beställningen i fråga över produkterna i fråga och sedan fråga efter den signaturen:
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