2014-12-01 165 views
0

我有這個查詢,我需要從3個表中拉回數據,但有一些需要發生的分組。我知道子查詢是可怕的,但我似乎無法以其他方式完成此任務。有幾萬行時,這將會崩潰。也許我過於複雜了?我嘗試了「分區依據」,但是這將會撤回ERT1中的所有行,這會弄亂計數。我不能使用一個組,因爲如果我在ERT1上進行分組,它會搞砸ER1。從Select語句中刪除子查詢?

我在連接字段上使用FK和索引。

任何人有任何想法?

這將是非常感謝!這是非常酷 -

SELECT ER.EventRegistrationID, DC.DiscountCodeID, DC.DiscountAmount, DC.DiscountCode, DC.ActiveFlag, 

    ISNULL((SELECT COUNT(ER1.EventRegistrationID) 
     FROM T_EventRegistration ER1 
     WHERE ER1.DiscountCode = DC.DiscountCode 
     AND ER1.EventID = DC.EventID 
     AND ER1.OrderCompleteFlag = 1),0) AS NumTimesUsed, --includes refunded orders 

    ISNULL((SELECT COUNT(ERT1.TicketNumber) 
     FROM T_EventRegistrationTickets ERT1, T_EventRegistration ER1 
     WHERE ER1.EventRegistrationID = ERT1.EventRegistrationID 
     AND ER1.DiscountCode = DC.DiscountCode 
     AND ER1.EventID = DC.EventID 
     AND ER1.OrderCompleteFlag = 1 
     ),0) AS NumTicketsSold --excludes refunded tickets 

FROM T_DiscountCodes DC, T_EventRegistration ER 
WHERE DC.DiscountCode *= ER.DiscountCode 
AND DC.EventID = 20188 
AND DC.DeleteFlag = 0 
AND DC.HiddenFlag = 0 
AND ER.OrderCompleteFlag = 1 
ORDER BY DC.DiscountCode, NumTimesUsed 

回答

1

您可以通過使用APPLY或通過創建派生表

SELECT ER.EventRegistrationID 
    , DC.DiscountCodeID 
    , DC.DiscountAmount 
    , DC.DiscountCode 
    , DC.ActiveFlag 
    , ISNULL(a,NumTimesUsed,0) 
    , ISNULL(a2.NumTicketsSold,0) 
FROM T_DiscountCodes DC, T_EventRegistration ER 
OUTER APPLY (SELECT COUNT(ERT1.TicketNumber) NumTimesUsed 
     FROM T_EventRegistrationTickets ERT1, T_EventRegistration ER1 
     WHERE ER1.EventRegistrationID = ERT1.EventRegistrationID 
     AND ER1.DiscountCode = DC.DiscountCode 
     AND ER1.EventID = DC.EventID 
     AND ER1.OrderCompleteFlag = 1) a 
OUTER APPLY (SELECT COUNT(ER1.EventRegistrationID) NumTicketsSold 
     FROM T_EventRegistration ER1 
     WHERE ER1.DiscountCode = DC.DiscountCode 
     AND ER1.EventID = DC.EventID 
     AND ER1.OrderCompleteFlag = 1) a2 
WHERE DC.DiscountCode *= ER.DiscountCode 
AND DC.EventID = 20188 
AND DC.DeleteFlag = 0 
AND DC.HiddenFlag = 0 
AND ER.OrderCompleteFlag = 1 
ORDER BY DC.DiscountCode, NumTimesUsed 
+0

我還沒有看到這個功能之前做到這一點。我認爲這比子查詢快得多?這是真的表現相同的概念,因此我問。謝謝! – Dennis 2014-12-01 19:54:50

+0

我不知道它對你的查詢有多大幫助,幾天前瞭解它。你應該檢查這個談話https://www.youtube.com/watch?v=-m426WYclz8 – Hatsjoem 2014-12-01 19:56:47

+0

這是一個很好的視頻。感謝分享!這似乎快得多。我投入我的生產服務器 - 讓我們看看它的表現!再次感謝 – Dennis 2014-12-01 20:12:49