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 を複数回使用できる場合は、Having 句を 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