Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Instrução SQL para selecionar o grupo contendo todo um conjunto de valores


Se a tabela OrderDetails contiver uma restrição exclusiva em OrderId e ProductId, você poderá fazer algo assim:
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
                )

Se for possível ter o mesmo ProductId no mesmo pedido várias vezes, você poderá alterar a cláusula Tendo para Count(Distinct ProductId) = 3

Agora, dado o exposto, se você quiser a situação em que cada pedido tenha a mesma assinatura com entradas de produtos duplicadas, isso é mais complicado. Para fazer isso, você precisaria da assinatura do pedido em questão sobre os produtos em questão e, em seguida, consultar essa assinatura:
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