2015-01-05 2 views
0

У меня есть запрос ниже, используя CTE. Мне интересно, есть ли другой подход, кроме этого. Поэтому я собираю некоторые рекомендации по его рефакторингу. Проконсультируйтесь пожалуйста. Или запрос выглядит хорошо, даже если я использую этот оператор IN (SELECT InvariantLanguageCultureCode FROM y) много раз в запросе?SQL Script с использованием CTE

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

В некоторых БД вы можете получить лучшую производительность, заменив 'IN' на InvariantLanguageCultureCode на' JOIN'. Вы можете использовать круглые скобки для создания отдельного соединения с 'y' для каждой таблицы, так как AFAICT не требует, чтобы LanguageCultureCode был одинаковым в' pt', 'pf',' jz', просто чтобы он находился в ' y'. –

ответ

0

Задать результат запроса в таблицу темп, чтобы его можно было повторно использовать столько раз, сколько необходимо.

Смежные вопросы