Si la table OrderDetails contient une contrainte unique sur OrderId et ProductId, vous pouvez faire quelque chose comme ceci :
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
)
S'il est possible d'avoir plusieurs fois le même ProductId sur la même commande, vous pouvez modifier la clause Ayant en Count(Distinct ProductId) = 3
Maintenant, compte tenu de ce qui précède, si vous voulez la situation où chaque commande a la même signature avec des entrées de produits en double, c'est plus délicat. Pour ce faire, vous auriez besoin de la signature de la commande en question sur les produits en question, puis de demander cette signature :
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