0

这听起来像是一个愚蠢的问题 - 如果之前已经回答过这个问题(几乎可以肯定),我深表歉意,但我无法通过搜索找到答案。

我有一个查询,它以不同的方式将表中的值聚合为子查询,用于不同的列,例如给定日期的事务、上个月、前 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 子句?谢谢 :o)

4

1 回答 1

0

这应该是等效的并且性能更好。

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
于 2016-10-28T13:46:42.267 回答