第一次在这里发布一个问题,但我是这个网站的常用用户,非常感谢这个对这些模糊问题有很好答案的社区。 p>
下面是一个Join,它将两个视图上的日期转换为导致约2千万个日期在" PDR"中重新格式化。视图。我只能在Join中使用年份和月份,这就是它被转换的原因(我没有选择)。
我只需要在这些列中包含数据IF Department_Code =' X'因此,最终汇总的约500行的90%将不会在这些列中具有任何内容。
我需要提高效率,如果部门代码=' X'
,我只想说转换日期我可以将该条件添加到加入吗?
Left Join [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup] as TMIPOP
on Left (Convert (varchar, TMIPOP.[Pharm_IPOP_MONTH], 112),6)
= Left (Convert (varchar, PDR.Payroll_Period_End_Date, 112),6)
答案 0 :(得分:0)
我需要提高效率,如果部门代码=' X'
,我只想说转换日期我可以将该条件添加到加入吗?
由于转换日期用于[左]连接条件,我认为避免转换意味着Department_Code
与'X'
不同的行(因此)不满足连接条件。
如果Department_Code
列在SLHSV_TM_Pharm_IP_OP_Factor_Rollup
上,那么最简单的方法就是编写连接条件,如下所示:
Left Join [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup] as TMIPOP
on TMIPOP.[Department_Code] = 'X'
and Left (Convert (varchar, TMIPOP.[Pharm_IPOP_MONTH], 112),6)
= Left (Convert (varchar, PDR.Payroll_Period_End_Date, 112),6)
当左侧评估为false时,您的查询计划程序然后可能避免评估AND
的右侧。允许这样做,但它实际上是否依赖于实现。
如果你想确定,那么你可以预先过滤你不想要的内表行:
Left Join (
select *
from [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup]
where [Department_Code] = 'X'
) as TMIPOP
on Left (Convert (varchar, TMIPOP.[Pharm_IPOP_MONTH], 112),6)
= Left (Convert (varchar, PDR.Payroll_Period_End_Date, 112),6)
如果Department_Code
列位于表PDR
上,那么您的选择会受到更多限制,但这应该有效(如果该列位于另一个表上,则模拟应该有效):
Left Join [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup] as TMIPOP
on case
when PDR.[Department_Code] = 'X'
then Left (Convert (varchar, TMIPOP.[Pharm_IPOP_MONTH], 112),6)
= Left (Convert (varchar, PDR.Payroll_Period_End_Date, 112),6)
else 1 = 0
end
可以想象,你会发现最后的代价比只进行所有转换更昂贵。由于性能显然是您的关注点,因此必须进行测试。建议您检查所评估选项的查询计划,这样可以帮助您找到更有效的变体。