我需要做這個更有效率,我想說轉換日期只有在Department_Code =「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)
你的查詢規劃然後可能避免評估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
可以想象的是,你會發現不僅僅是做所有的轉換,去年更貴。由於性能顯然是您關心的問題,所以測試至關重要。查看您評估的選項的查詢計劃也是可取的,因爲這可能會幫助您找到效果更好的變化。
其中RDBMS?代替轉換爲varchar,您可以通過在YEAR(日期)= YEAR(日期)和MONTH()= MONTH()兩方面加入數據來保持日期轉換爲數學。這可能有助於表現一些。否則,您可以編寫一個case語句,無論您想要什麼時候case case = 1,然後加入。例如。 (CASE當department_cod ='X'和MONTH(a)= MONTH(b)和YEAR(a)= YEAR(b)THEN 1 ELSE 0 END)= 1 – Matt