Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Instruction SQL pour sélectionner un groupe contenant tout un ensemble de valeurs

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