sql >> Database >  >> RDS >> Sqlserver

SQL-instructie om een ​​groep te selecteren die een hele set waarden bevat

Als de tabel OrderDetails een unieke beperking op OrderId en ProductId bevat, kunt u zoiets als dit doen:

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
                )

Als het mogelijk is om dezelfde ProductId meerdere keren op dezelfde Order te hebben, dan kunt u de Having-clausule wijzigen in Count(Distinct ProductId) = 3

Nu, gezien het bovenstaande, als u de situatie wilt waarin elke bestelling dezelfde handtekening heeft met dubbele productinvoeringen, is dat lastiger. Om dat te doen, hebt u de handtekening van de bestelling in kwestie nodig over de producten in kwestie en vervolgens om die handtekening vragen:

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. PHP:Wat is de snelste manier om MySQL op te vragen? Omdat PDO pijnlijk traag is

  2. Prioriteiten stellen tussen mysql-processen

  3. MySQL Workbench:kan geen verbinding maken met MySQL-server op 127.0.0.1' (10061) fout

  4. Opgegeven sleutel was te lang; maximale sleutellengte is 767 bytes Mysql-fout in Entity Framework 6