استخدم قيمة اليد اليسرى في المقارنة بين اليد اليمنى SQL
-
22-09-2019 - |
سؤال
لدي هذا 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
إذا قمت بتوصيل @From
, @To
و @X
إنها تعمل. هذا هو أن يكون الجانب الأيمن من المقارنة. ولكن في المقارنة @X
يحتاج إلى أن يأتي من الجانب الأيسر من SELECT
في الخارج هو إجراء اختبار على كل SiteID
في المجموعة. بدون هذا البند ، يعمل البند الرئيسي. انهم بحاجة للذهاب معا. فيما يلي عبارة SELECT الكاملة مع LEFTES SELECT IN.
--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
كيف تستخدم البند الخارجي في بيان داخلي؟ الجحيم ، لا أعرف حتى إذا كنت أستخدم المصطلحات الصحيحة لوصف مشكلتي.
ARRGGHH - المنطق المستند إلى تعيين رأسي في !!
المحلول 2
مات ويتفيلد على ال ask.sqlservercentral توصل موقع Stacexchange إلى الإجابة التالية على هذه المشكلة:
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
و ريك جاء مع هذا الإجابة على ask.sqlteam.com موقع:
--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
كلاهما يعمل بشكل رائع ، على الرغم من أن جهد Matts أفضل جهد ريكس على الرغم من وجهة نظري الأولية بأن الانضمام سيكون أسرع. يستغرق MATTS ~ 2M 10s بينما يستغرق Ricks ~ 2 مليون. هذا هو لأكبر قاعدة بيانات حية حيث يأخذ كلاهما أقل من 10s في اختبار DB.
نصائح أخرى
أعتقد أنك تريد الانضمام إلى هذه الاستعلام الفرعي ، وليس استخدامه في بيان
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