2015-01-05 3 views
0

아래에 CTE를 사용하는 쿼리가 있습니다. 나는 이것 이외의 접근법이 있는지 궁금해. 그래서 저는 그것을 리팩터링하는 조언을 모으고 있습니다. 어떤 조언을 해주십시오. 또는이 쿼리를 여러 번 사용하면이 쿼리를 사용해도 쿼리가 잘 보입니까?CTE를 사용하는 SQL 스크립트

DECLARE @ReportingInstanceID INT 

SET @ReportingInstanceID=34 
;WITH x AS (
    SELECT [dbo].[tenant_Reporting_Instance].UserID 
    FROM [dbo].[tenant_Reporting_Instance] 
    WHERE tenant_Reporting_Instance.ReportingInstanceID = @ReportingInstanceID 
), y AS ( 
    SELECT [TRCCore].[dbo].[pr_Language].InvariantLanguageCultureCode 
    FROM [TRCCore].[dbo].[pr_Language] 
    JOIN [dbo].[tenant_User_Setting] 
     ON tenant_User_Setting.LanguageID = pr_Language.LanguageID 
    WHERE tenant_User_Setting.UserID IN (
       SELECT UserID FROM x 
    ) 
), Default_User_Settings_CTE (RoundingTypeInvariantCode, AgingDateValue 
          , CurrencyLabel, JobZoneLinkTypeLabel, MatchPeriodLabel 
          , PayFrequencyLabel, PayTypeLabel) 
    AS (SELECT r.RoundingTypeInvariantCode , 
        a.AgingDateValue , 
        cur.CurrencyLabel , 
        jz.JobZoneLinkTypeLabel , 
        m.MatchPeriodLabel , 
        pf.PayFrequencyLabel , 
        pt.PayTypeLabel 
     FROM  dbo.tenant_User_Setting s 
     JOIN TRCCore.dbo.pr_Rounding_Type r 
      ON r.RoundingTypeID = s.RoundingTypeID 
     JOIN dbo.tenant_Aging_Date a 
      ON a.AgingDateID = s.AgingDateID 
     JOIN TRCCore.dbo.translation_pr_Currency cur 
      ON cur.CurrencyID = s.CurrencyID 
      AND cur.LanguageCultureCode IN (SELECT InvariantLanguageCultureCode 
               FROM y) 
     JOIN dbo.translation_tenant_Job_Zone_Link_Type jz 
      ON jz.JobZoneLinkTypeID = s.JobZoneLinkTypeID 
      AND jz.LanguageCultureCode IN ( SELECT InvariantLanguageCultureCode 
               FROM y) 
     JOIN dbo.tenant_Match_Period m 
      ON m.MatchPeriodID = s.MatchPeriodID 
     JOIN dbo.translation_tenant_Pay_Frequency pf 
      ON pf.PayFrequencyID = s.PayFrequencyID 
      AND pf.LanguageCultureCode IN (SELECT InvariantLanguageCultureCode 
              FROM y) 
     JOIN dbo.translation_app_Pay_Type pt 
      ON pt.PayTypeID = s.PayTypeID 
      AND pt.LanguageCultureCode IN (SELECT InvariantLanguageCultureCode 
              FROM y) 
     WHERE s.UserID IN (SELECT UserID FROM x) 
    ) 
    SELECT * FROM Default_User_Settings_CTE 
+1

예상대로 작동합니까? 그렇다면 귀하의 질문을 codereview.stackexchange.com으로 이동하여 개선을위한 조언을 얻으십시오. 그렇지 않은 경우이 쿼리에 어떤 오류가 발생했는지 설명하십시오. –

+1

아하이 봐요. 감사. 나는 어떤 오류도 만나지 않았다. 내 질문 이외에 내 구현 이외의 다른 방법이 있습니다. 어쨌든, 당신이 추천 한 사이트에 제 질문을 올렸습니다. –

+0

일부 DB의 경우 InvariantLanguageCultureCode의 'IN'을 'JOIN'으로 바꾸면 성능이 향상 될 수 있습니다. AFAICT는''pt','pf','jz'에서 LanguageCultureCode가 같을 필요가 없기 때문에 괄호를 사용하여 각 테이블에 대해'y'와 별도로 조인 할 수 있습니다. 단지' y'리스트. –

답변

0

쿼리 결과를 필요에 따라 여러 번 재사용 할 수 있도록 임시 테이블에 채 웁니다.

관련 문제