sql >> Databasteknik >  >> RDS >> Sqlserver

Komplicerad SQL-fråga - hitta objekt som matchar flera olika främmande nycklar

Förutsatt att du har unika index på båda (ProductID, CategoryID) och (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 om dina värden skickas i CSV strängar:

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
        )

Observera att i SQL Server 2008 du kan skicka parametrar med tabellvärde till de lagrade procedurerna.



  1. Är det möjligt för SQL Output-sats att returnera en kolumn som inte infogas?

  2. Välj separata rader från två tabeller, sortera efter datum

  3. MySQL-handledning – Hantera MySQL-serverloggar:Rotera, komprimera, behålla och ta bort

  4. Hur man trimmar de tre första tecknen baserat på den första bokstaven (uttrycket) innan det infogas i databasen