Эффективность 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