Use um valor esquerdo na comparação SQL da mão direita
-
22-09-2019 - |
Pergunta
eu tenho isto SELECT
declaração:
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 você conectar o @From
, @To
e @X
funciona. Este deve ser o lado direito de uma comparação. No entanto, na comparação o @X
precisa vir do lado esquerdo do como o SELECT
do lado de fora está realizando teste em cada SiteID
no conjunto. Sem essa cláusula, a cláusula principal funciona. Eles precisam ir juntos. Aqui está a instrução SELECT completa com as opções acima, selecione a esquerda. Eventualmente, as duas com cláusulas determinarão os principais produtos para um 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
Como você usa a cláusula externa em uma declaração interna? Inferno, eu nem sei se estou usando a terminologia correta para descrever meu problema.
Arrgghh - Lógica baseada em conjunto faz minha cabeça !!
Solução 2
Matt Whitfield no Ask.SqlServerCentral O site StackexChange apresentou a seguinte resposta para este 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
E Rickd surgiu com esta resposta no 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
Ambos funcionam muito bem, embora Matts esteja melhor o esforço de Ricks, apesar da minha visão inicial de que uma junção seria mais rápida. Matts leva ~ 2m 10s enquanto Ricks leva ~ 2m 40s. Isso é para o maior banco de dados ao vivo, pois ambos leva menos de 10s no banco de dados de teste.
Outras dicas
Eu acho que você quer se juntar a esta subconsulta, não usá -la em uma declaração
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