Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL-Anweisung zum Auswählen einer Gruppe, die alle Werte eines Satzes enthält

Wenn die OrderDetails-Tabelle eine eindeutige Einschränkung für OrderId und ProductId enthält, können Sie etwa so vorgehen:

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
                )

Wenn es möglich ist, dieselbe ProductId mehrmals in derselben Bestellung zu haben, können Sie die Having-Klausel in Count(Distinct ProductId) = 3 ändern

Wenn Sie nun angesichts der obigen Ausführungen die Situation wünschen, in der jede Bestellung dieselbe Signatur mit doppelten Produkteinträgen hat, ist das schwieriger. Dazu benötigen Sie die Signatur der betreffenden Bestellung über den betreffenden Produkten und fragen dann nach dieser Signatur:

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