Эффективность SQL-сервера при соединении таблицы с самим собой, а не как выбор в подзапросе

Это может звучать как глупый вопрос - извинения, если на этот вопрос уже был дан ответ (почти наверняка), но я не смог найти ответ с помощью поиска.

У меня есть запрос, который по-разному объединяет значения в таблице как подзапрос для разных столбцов, например, для транзакции в определенный день, транзакций в предыдущем месяце, в предыдущие 6 месяцев, до этого, после этого. Я псевдоним основной таблицы как TX, а затем псевдоним подзапроса как TX1

SELECT 
    tr.transaction_value
    ,ISNULL(
         (SELECT SUM(tr1.transaction_value) FROM [MyDB].[dbo].[Transactions] tr1
         WHERE tr1.Client_Ref = tr.Client_Ref),0) AND tr1.Transaction_Date > tr.Transaction_Date 
     ),0) as 'Future_Transactions'
    ,ISNULL(
         (SELECT SUM(tr1.transaction_value) FROM [MyDB].[dbo].[Transactions] tr1
         WHERE tr1.Client_Ref = tr.Client_Ref),0) AND tr1.Transaction_Date < tr.Transaction_Date 
     ),0) as 'Prior_Transactions'
FROM [MyDB].[dbo].[Transactions] tr 

Я хочу знать, если у меня есть 7 таких столбцов с подзапросами, определяющими таблицу 7 раз в подзапросах, возможно и лучше (более эффективно, более читабельно) создать tx1 в качестве INNER JOIN для запроса основной таблицы, а не пересоздавать это в каждом подзапросе, и если да, то как бы я закодировал предложения WHERE? Спасибо: о)

1 ответ

Это должно быть эквивалентно и более эффективно.

SELECT 
    tr.transaction_value
    ,SUM(tr1.transaction_value) as 'Future_Transactions'
    ,SUM(tr2.transaction_value) as 'Prior_Transactions'
FROM [MyDB].[dbo].[Transactions] tr
LEFT JOIN [MyDB].[dbo].[Transactions] tr1 ON tr1.Client_Ref = tr.Client_Ref AND tr1.Transaction_Date > tr.Transaction_Date 
LEFT JOIN [MyDB].[dbo].[Transactions] tr2 ON tr2.Client_Ref = tr.Client_Ref AND tr2.Transaction_Date < tr.Transaction_Date 
group by tr.transaction_value
Другие вопросы по тегам