这是一个更大的声明的一部分,但我想知道CTE或其他方法是否有助于提高效率或清洁度。我可以把它写成一个表值函数,并将其包含在我的from子句中,但如果有另一个解决方案,我想避免额外的对象。如何减少许多类似的相关子查询?
SELECT TOP 1 ...
SELECT TOP 1 ...
这里的子查询只是在我有一个早于生效日期的基准表的速率时被捕获,但我不喜欢为我需要访问的每一列重复它们。有没有更好的方法来完成这个,或者这是一个正常的前瞻性陈述?
SELECT j.EmployeeId
,j.CompanyId
,j.JobCode
,COALESCE(j.CustomWageRate, r.WageRate, (SELECT TOP 1 WageRate
FROM ContractLabor.CompanyJobRates
WHERE CompanyId = j.CompanyId
AND JobCode = j.JobCode
AND EffectiveDate < j.EffectiveDate
ORDER BY EffectiveDate DESC), 0) AS EffectiveRate
,COALESCE(r.CustomBurdenRateReg, (SELECT TOP 1 CustomBurdenRateReg
FROM ContractLabor.CompanyJobRates
WHERE CompanyId = j.CompanyId
AND JobCode = j.JobCode
AND EffectiveDate < j.EffectiveDate
ORDER BY EffectiveDate DESC)) AS CustomBurdenRateReg
,COALESCE(r.CustomBurdenRateOvt, (SELECT TOP 1 CustomBurdenRateOvt
FROM ContractLabor.CompanyJobRates
WHERE CompanyId = j.CompanyId
AND JobCode = j.JobCode
AND EffectiveDate < j.EffectiveDate
ORDER BY EffectiveDate DESC)) AS CustomBurdenRateOvt
,COALESCE(r.CustomBurdenRateDbl, (SELECT TOP 1 CustomBurdenRateDbl
FROM ContractLabor.CompanyJobRates
WHERE CompanyId = j.CompanyId
AND JobCode = j.JobCode
AND EffectiveDate < j.EffectiveDate
ORDER BY EffectiveDate DESC)) AS CustomBurdenRateDbl
,j.EffectiveDate
FROM ContractLabor.EmployeeJobDetails j
LEFT JOIN ContractLabor.CompanyJobRates r
ON j.CompanyId = r.CompanyId
AND j.JobCode = r.JobCode
AND j.EffectiveDate = r.EffectiveDate
啊,好多了。 “外部应用”是我不知道寻找的缺失部分。谢谢。 – JustinStolle
不客气。您可以使用“SET STATISTICS IO ON”来查看这两个查询完成了多少个逻辑和物理读取。越少越好。 [使用APPLY](http://msdn.microsoft.com/en-us/library/ms175156%28v=SQL.90%29.aspx)。 –