2014-12-01 4 views
0

У меня есть этот запрос, где мне нужно отбросить данные из 3 таблиц, но есть некоторые группы, которые должны произойти. Я знаю, что подзапросы ужасны, но я не могу сделать это иначе. Это развалится, когда будет десятки и десятки тысяч строк. Может быть, я слишком усложняю это? Я попробовал «partition by», но это приведет к отмене всех строк из ERT1, что испортило бы подсчеты. Я не мог использовать группу, поскольку, если я буду группироваться в ERT1, это испортит ER1.Удалить подпрограммы из запроса выбора?

Я использую 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

+0

Я не знаю, насколько это помогает в вашем запросе tho, узнал об этом несколько дней назад. Вы должны проверить этот разговор https://www.youtube.com/watch?v=-m426WYclz8 – Hatsjoem

+0

Это хорошее видео. Спасибо, что поделился! Это выглядит намного быстрее. Я зашел на свой производственный сервер - посмотрим, как он работает! Еще раз спасибо – Dennis