sql >> Databasteknik >  >> RDS >> Sqlserver

SQL-sats för att välja grupp som innehåller alla en uppsättning värden

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


  1. ORACLE:Materialiserad vy fungerar inte när du använder LEFT JOIN

  2. Hur man hämtar Date från en resultatuppsättning

  3. Hitta låst tabell i SQL Server

  4. Lika med (=) mot LIKE för datumdatatyp