仅当在 Join 中间满足条件时才转换
Convert only if criteria are met in the middle of a Join
第一次在这里发布问题,但我是这个网站的常客,非常感谢这个社区对晦涩的问题有很好的答案。
下面是一个在两个视图上转换日期的联接,导致约 2000 万个日期在 "PDR" 视图中重新格式化。我只能在 Join 中使用年份和月份,这就是它被转换的原因(我在这部分没有选择)。
我只需要在这些列中包含数据 IF Department_Code = 'X' 因此最终汇总的 ~500 行结果中的 90% 不会在这些列中包含任何内容。
我需要提高效率,我想说只有在 Department_Code = '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)
I need to make this more efficient, I'd like to say convert the date ONLY if the Department_Code = 'X'
Am I able to add that criteria to a Join?
由于在您的 [left] 连接条件中使用了转换后的日期,我想避免转换意味着 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)
然后您的查询计划器 可能 避免在 AND
的左侧评估为 false 时评估右侧。允许这样做,但是否真的这样做取决于实现。
如果你想确定,那么你可以预过滤你不想要的内table行:
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
列改为 table PDR
,那么您的选择将更加有限,但这应该有效(如果该列在其他 table):
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
可以想象,您会发现 last 比仅进行所有转换更昂贵。由于性能显然是您关心的问题,因此测试是必不可少的。还建议检查您评估的选项的查询计划,因为这可能有助于您找到效果更好的变体。
第一次在这里发布问题,但我是这个网站的常客,非常感谢这个社区对晦涩的问题有很好的答案。
下面是一个在两个视图上转换日期的联接,导致约 2000 万个日期在 "PDR" 视图中重新格式化。我只能在 Join 中使用年份和月份,这就是它被转换的原因(我在这部分没有选择)。
我只需要在这些列中包含数据 IF Department_Code = 'X' 因此最终汇总的 ~500 行结果中的 90% 不会在这些列中包含任何内容。
我需要提高效率,我想说只有在 Department_Code = '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)
I need to make this more efficient, I'd like to say convert the date ONLY if the Department_Code = 'X'
Am I able to add that criteria to a Join?
由于在您的 [left] 连接条件中使用了转换后的日期,我想避免转换意味着 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)
然后您的查询计划器 可能 避免在 AND
的左侧评估为 false 时评估右侧。允许这样做,但是否真的这样做取决于实现。
如果你想确定,那么你可以预过滤你不想要的内table行:
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
列改为 table PDR
,那么您的选择将更加有限,但这应该有效(如果该列在其他 table):
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
可以想象,您会发现 last 比仅进行所有转换更昂贵。由于性能显然是您关心的问题,因此测试是必不可少的。还建议检查您评估的选项的查询计划,因为这可能有助于您找到效果更好的变体。