sql >> Database teknologi >  >> RDS >> Sqlserver

Kompliceret SQL-forespørgsel - at finde elementer, der matcher flere forskellige fremmednøgler

Forudsat at du har unikke indekser på begge (ProductID, CategoryID) og (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

eller, hvis dine værdier sendes i CSV strenge:

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
        )

Bemærk, at i SQL Server 2008 du kan overføre tabelværdiparametre til de lagrede procedurer.



  1. MYSQL:Opdater felt med sammensætning af flere felter

  2. Brug af DATE_ADD med et kolonnenavn som intervalværdi

  3. Oracle SQL Where-klausul for at finde datoposter, der er ældre end 30 dage

  4. Fælles tabeludtryk, hvorfor semikolon?