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
Работает ли это так, как ожидалось? Если да, переместите свой вопрос на codereview.stackexchange.com, чтобы получить совет по его улучшению. Если нет, укажите, какую ошибку вы получите с этим запросом. –
О, я вижу. Благодарю. У меня не было никаких ошибок. Мой вопрос в том, есть ли другие способы, кроме моей реализации. Во всяком случае, я разместил свой вопрос на сайте, о котором вы говорили. –
В некоторых БД вы можете получить лучшую производительность, заменив 'IN' на InvariantLanguageCultureCode на' JOIN'. Вы можете использовать круглые скобки для создания отдельного соединения с 'y' для каждой таблицы, так как AFAICT не требует, чтобы LanguageCultureCode был одинаковым в' pt', 'pf',' jz', просто чтобы он находился в ' y'. –