استخدم قيمة اليد اليسرى في المقارنة بين اليد اليمنى SQL

StackOverflow https://stackoverflow.com/questions/1589521

  •  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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top