Verwenden Sie einen linken Hand-Wert in der rechten Hand SQL Vergleich
-
22-09-2019 - |
Frage
Ich habe diese SELECT
Anweisung:
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
Wenn Sie in der @From
, @To
Plug-and-@X
es funktioniert. Dies ist die rechte Seite eines Vergleichs sein. Jedoch im Vergleich benötigt der @X
auf der linken Seite des wie die SELECT
auf der Außenseite zu kommen, ist die Durchführung Test auf jedem SiteID
im Set. Ohne diese Klausel arbeitet der Hauptsatz. Sie müssen zusammen gehen. Hier ist die vollständige select-Anweisung mit der oben wählen Sie links in. Schließlich werden die beiden having-Klauseln werden die wichtigsten Produkte für eine Website bestimmen.
--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
Wie verwenden Sie die äußere Klausel auf einer inneren Aussage? die Hölle, ich weiß nicht einmal, ob ich die richtige Terminologie bin mit meinem Problem zu beschreiben.
Arrgghh - Set basierte Logik funktioniert meinen Kopf in !!
Lösung 2
Matt Whitfield auf der ask.sqlservercentral Stack Website kam mit der folgenden Antwort auf dieses Problem :
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
Und RickD kam mit dieser Antwort auf dem Spiel ask.sqlteam.com Website:
--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
Beide arbeiten groß, obwohl Matts Bestzeiten Ricks Anstrengung trotz meiner anfänglichen Auffassung, dass ein schneller wäre Mitglied werden. Matts nimmt ~ 2m 10s während Ricks ~ 2m 40s dauert. Dies ist für die größte Live-Datenbank, da beide in weniger als 10 s auf dem Test db.
Andere Tipps
Ich glaube, du diese Unterabfrage anschließen möchten, verwenden Sie es nicht in einer mit Anweisung
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