Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Instrukcja SQL do wybrania grupy zawierającej cały zestaw wartości

Jeśli tabela OrderDetails zawiera unikatowe ograniczenie dla OrderId i ProductId, możesz zrobić coś takiego:

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
                )

Jeśli możliwe jest wielokrotne posiadanie tego samego identyfikatora produktu w tym samym zamówieniu, możesz zmienić klauzulę Have na Count(Distinct ProductId) = 3

Teraz, biorąc pod uwagę powyższe, jeśli chcesz, aby każde zamówienie miało ten sam podpis i zduplikowane wpisy produktów, jest to trudniejsze. Aby to zrobić, potrzebujesz podpisu danego zamówienia na przedmiotowych produktach, a następnie zapytaj o ten podpis:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zamiana określonego znaku w adresach e-mail na „*” w zapytaniu SQL

  2. Jak wygenerować zapytanie aktualizacyjne zapytania dynamicznego (automatycznie)?

  3. Obsługuj wiele wyników z procedury składowanej za pomocą SqlQuery

  4. Zwróć wiersze zawierające znaki inne niż alfanumeryczne w SQL Server

  5. Jak dowiedzieć się, która kolumna powoduje błąd przepełnienia arytmetycznego po wstawieniu?