sql >> Base de Datos >  >> RDS >> Sqlserver

Declaración SQL para seleccionar un grupo que contiene todo un conjunto de valores

Si la tabla OrderDetails contiene una restricción única en OrderId y ProductId, puede hacer algo como esto:

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
                )

Si es posible tener el mismo ProductId en el mismo pedido varias veces, entonces podría cambiar la cláusula Tener a Count(Distinct ProductId) = 3

Ahora, dado lo anterior, si desea la situación en la que cada pedido tiene la misma firma con entradas de productos duplicadas, eso es más complicado. Para hacerlo, necesitaría la firma del pedido en cuestión sobre los productos en cuestión y luego consultar esa firma:

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