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

Skomplikowane zapytanie SQL — znajdowanie elementów pasujących do wielu różnych kluczy obcych

Pod warunkiem, że masz unikalne indeksy na obu (ProductID, CategoryID) i (ProductID, InvoiceID) :

SELECT  ProductID
FROM    (
        SELECT  ProductID
        FROM    ProductInvoice
        WHERE   InvoiceID IN (1, 2)
        UNION ALL
        SELECT  ProductID
        FROM    ProductCategory pc
        WHERE   CategoryID IN (3, 4)
        ) q
GROUP BY
        ProductID
HAVING  COUNT(*) = 4

lub jeśli Twoje wartości są przekazywane w CSV ciągi:

WITH    catids(value) AS
        (
        SELECT  DISTINCT CAST([value] AS INT)
        FROM    dbo.split(@categories, ' '))
        ), 
        (
        SELECT  DISTINCT CAST([value] AS INT)
        FROM    dbo.split(@invoices, ' '))
        )
SELECT  ProductID
FROM    (
        SELECT  ProductID
        FROM    ProductInvoice
        WHERE   InvoiceID IN
                (
                SELECT  value
                FROM    invoiceids
                )
        UNION ALL
        SELECT  ProductID
        FROM    ProductCategory pc
        WHERE   CategoryID IN
                (
                SELECT  value
                FROM    catids
                )
        ) q
GROUP BY
        ProductID
HAVING  COUNT(*) = 
        (
        SELECT  COUNT(*)
        FROM    catids
        ) + 
        (
        SELECT  COUNT(*)
        FROM    invoiceids
        )

Zauważ, że w SQL Server 2008 możesz przekazać parametry wycenione w tabeli do procedur składowanych.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zaktualizuj kolumnę licznika z danych w innej tabeli

  2. Domyślna sygnatura czasowa programu SQL Server?

  3. Automatyczne usuwanie zapomnianych transakcji w MS SQL Server

  4. Najlepsze sposoby użycia instrukcji SQL DELETE w tabeli SQL

  5. SQL Server 2008 Pusty ciąg a spacja