sql >> Database >  >> RDS >> Sqlserver

Ingewikkelde SQL-query - items vinden die overeenkomen met meerdere verschillende externe sleutels

Op voorwaarde dat u unieke indices heeft op beide (ProductID, CategoryID) en (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

of, als uw waarden worden doorgegeven in CSV snaren:

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
        )

Merk op dat in SQL Server 2008 u kunt parameters met tabelwaarde doorgeven aan de opgeslagen procedures.



  1. MySQL-database met unieke velden negeerde eindspaties

  2. Prestaties van query's over twee mysql-databases op dezelfde server?

  3. Hoe codeer je een apostrof zodat deze doorzoekbaar is in mysql?

  4. Een wachtwoord van zes tekens maken in MySQL 5.7