Utilisez une valeur de gauche en comparaison SQL main droite
-
22-09-2019 - |
Question
J'ai cette déclaration de 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
Si vous branchez le @From
, @To
et @X
cela fonctionne. Ce doit être le côté droit d'une comparaison. Cependant, dans la comparaison, le @X
doit venir du côté gauche de la SELECT
comme à l'extérieur effectue test sur tous les SiteID
dans l'ensemble. Sans cette clause la clause principale fonctionne. Ils doivent aller de pair. Voici l'instruction select complète avec la sélection ci-dessus à gauche dans. Finalement, les deux clauses ayant détermineront les principaux produits d'un site.
--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
Comment utilisez-vous la clause externe sur une déclaration intérieure? L'enfer, je ne sais même pas si j'utilise la terminologie correcte pour décrire mon problème.
arrgghh - Définir une logique basée fait ma tête !!
La solution 2
Matt Whitfield sur ask.sqlservercentral le site StackExchange est venu avec la réponse suivante ce problème :
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 est venu avec cette réponse sur le ask.sqlteam.com site:
--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
Les deux fonctionnent très bien, mais Matts bests effort Ricks malgré mon point de vue initial qu'une inscription serait plus rapide. Matts prend ~ 2m 10s tandis que Ricks prend ~ 40s 2m. Ceci est la plus grande base de données en direct à la fois prend moins de 10 secondes sur le db de test.
Autres conseils
Je pense que vous voulez rejoindre ce sous-requête, pas l'utiliser dans une déclaration ayant
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