Utilizzare un valore della mano sinistra in confronto SQL mano destra
-
22-09-2019 - |
Domanda
Ho questa affermazione SELECT
:
SELECT SUM(dbo.DLData.Quantity)
FROM dbo.MasterDates
JOIN dbo.DLData ON MasterDates.[ID] = dbo.DLData.DownloadID
WHERE dbo.MasterDates.[Date] BETWEEN @From AND @To
AND dbo.MasterDates.SiteID = @X
Se si collega il @From
, @To
e @X
funziona. Questo deve essere il lato destro di un confronto. Tuttavia, in confronto al @X
deve venire dal lato sinistro della prova come SELECT
all'esterno sta eseguendo su ogni SiteID
nel set. Senza questa clausola la frase principale funziona. Hanno bisogno di andare insieme. Ecco la dichiarazione prescelta completa con quanto sopra selezionare lasciato in. Alla fine i due hanno clausole determineranno i prodotti chiave per un sito.
--INSERT INTO SiteKeyProducts
SELECT dbo.MasterDates.SiteID as SiteID , dbo.DLData.Product as ProductID
FROM dbo.MasterDates
JOIN dbo.DLData ON dbo.MasterDates.[ID] = dbo.DLData.DownloadID
WHERE dbo.MasterDates.[Date] BETWEEN @From AND @To
GROUP BY dbo.MasterDates.SiteID , dbo.DLData.Product
HAVING
SUM(dbo.DLData.Quantity) > 960 OR
SUM(dbo.DLData.Quantity) > (SELECT SUM(dbo.DLData.Quantity)
FROM dbo.MasterDates
JOIN dbo.DLData ON MasterDates.[ID] = dbo.DLData.DownloadID
WHERE dbo.MasterDates.[Date] BETWEEN @From AND @To
AND dbo.MasterDates.SiteID = @X)
ORDER BY dbo.MasterDates.SiteID
Come si utilizza la clausola esterno su una dichiarazione interiore? Diavolo, non so nemmeno se sto usando la terminologia corretta per descrivere il mio problema.
Arrgghh - logica basata Set fa la mia testa !!
Soluzione 2
Matt Whitfield sul ask.sqlservercentral sito StackExchange si avvicinò con la seguente risposta al questo problema :
SELECT outerMaster.SiteID as SiteID , dbo.DLData.Product as ProductID
FROM dbo.MasterDates outerMaster
JOIN dbo.DLData ON outerMaster.[ID] = dbo.DLData.DownloadID
WHERE outerMaster.[Date] BETWEEN @From AND @To
GROUP BY outerMaster.SiteID , dbo.DLData.Product
HAVING
SUM(dbo.DLData.Quantity) > 960 OR
SUM(dbo.DLData.Quantity) > (SELECT SUM(dbo.DLData.Quantity)
FROM dbo.MasterDates innerMaster
JOIN dbo.DLData ON innerMaster.[ID] = dbo.DLData.DownloadID
WHERE innerMaster.[Date] BETWEEN @From AND @To
AND innerMaster.SiteID = outerMaster.SiteID)
ORDER BY outerMaster.SiteID
RickD si avvicinò con questa risposta sulla ask.sqlteam.com sito:
--INSERT INTO SiteKeyProducts
SELECT
MD.SiteID as SiteID ,
DLD.Product as ProductID
FROM dbo.MasterDates MD
JOIN dbo.DLData DLD
ON MD.[ID] = DLD.DownloadID
LEFT JOIN (SELECT SiteID,
SUM(dbo.DLData.Quantity) SumMDQuantity
FROM dbo.MasterDates
JOIN dbo.DLData ON MasterDates.[ID] = dbo.DLData.DownloadID
WHERE dbo.MasterDates.[Date] BETWEEN @From AND @To
GROUP BY SiteID) as sumMD
ON sumMD.SiteID = MD.SiteID
WHERE MD.[Date] BETWEEN @From AND @To
GROUP BY MD.SiteID , DLD.Product
HAVING
SUM(DLD.Quantity) > 960 OR
SUM(DLD.Quantity) > sumMD.SumMDQuantity
ORDER BY MD.SiteID
Entrambi funzionano grande, anche se Matts Migliori prestazioni sforzo Ricks nonostante la mia vista iniziale che una registrazione sarebbe più veloce. Matts prende ~ 10s 2m mentre Ricks prende ~ 40s 2m. Questo è per il più grande database dal vivo sia come richiede meno di 10 secondi sul db di prova.
Altri suggerimenti
Penso che si desidera partecipare a questo subquery, non lo uso in una dichiarazione che ha
SELECT SUM(dbo.DLData.Quantity)
FROM dbo.MasterDates
JOIN dbo.DLData ON MasterDates.[ID] = dbo.DLData.DownloadID
WHERE dbo.MasterDates.[Date] BETWEEN @From AND @To
AND dbo.MasterDates.SiteID = @X