2016-10-28 3 views
0

이전에 (거의 확실하게) 대답했지만 검색으로 대답을 찾을 수없는 경우 사과드립니다.서브 쿼리에서 select가 아닌 테이블 자체에 테이블을 조인하는 효율

다른 열에 대해 다른 방법으로 하위 쿼리로 값을 집계하는 쿼리가 있습니다 (예 : 특정 날짜의 거래의 경우 전월, 이전 6 개월, 그 전의 거래가 그 다음에 있습니다. 나는 텍사스와 같은 기본 테이블, 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 번 하위 쿼리에서 테이블을 정의하고, 알고 싶은, 그것은 가능하고 더 나은를 별칭 (보다 효율적이고 읽기 쉽도록) 각 하위 쿼리에서 다시 작성하지 않고 기본 테이블 쿼리에서 INNER JOIN으로 tx1을 생성합니다. 그렇다면 어떻게 WHERE 절을 코딩합니까? 감사합니다 : o)

답변

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