sql >> Databáze >  >> RDS >> Sqlserver

Komplikovaný SQL Query – hledání položek odpovídajících více různým cizím klíčům

Za předpokladu, že máte jedinečné indexy na obou (ProductID, CategoryID) a (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

nebo pokud jsou vaše hodnoty předány v CSV řetězce:

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
        )

Všimněte si, že v SQL Server 2008 můžete předat parametry s hodnotou tabulky do uložených procedur.



  1. Rozdíl mezi příkazy SQL a klauzulí

  2. ROW_NUMBER v SQL – Vyberte Nejlepší příklad v SQL a SQL Server

  3. onCreate() z RoomDatabase.Callback() nebylo voláno po úspěšném volání .build()

  4. Jak spustit uloženou proceduru z Laravelu