Je dois le rendre plus efficace, je voudrais dire convertir la date que si le Department_Code = « X »
Suis-je en mesure d'ajouter que les critères à une jointure?
Depuis les dates converties sont utilisées dans votre [gauche] condition de jointure, je suppose que d'éviter les moyens de conversion des lignes avec Department_Code
différent de 'X'
(pour cette raison) satisfont pas à la condition de jointure.
Si la colonne Department_Code
est SLHSV_TM_Pharm_IP_OP_Factor_Rollup
, alors la meilleure chose à faire serait d'écrire la condition de jointure comme ceci:
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)
Votre planificateur de requêtes alors pourrait éviter d'évaluer le côté droit du AND
quand le côté gauche évalue à faux. Il est permis de le faire, mais que cela dépende de l'implémentation.
Si vous voulez être certain, vous pouvez pré-filtrer les lignes de la table intérieure vous ne voulez pas:
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)
Si la colonne Department_Code
est à la place sur la table PDR
, vos choix sont plus limité, mais cela devrait fonctionner (et un convertisseur analogique devrait fonctionner si cette colonne est sur l'autre 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
Il est concevable que vous trouveriez cette dernière plus cher que de simplement faire toutes les conversions. Puisque la performance est apparemment votre préoccupation ici, il est essentiel de tester. Il est également conseillé d'examiner les plans de requête pour les options que vous évaluez, car cela pourrait vous aider à trouver des variantes qui fonctionnent mieux.
quel RDBMS? Au lieu de convertir en varchar, vous pouvez conserver les conversions de date comme étant mathématique en vous joignant à la fois YEAR (date) = YEAR (date) et MONTH() = MONTH(). Cela pourrait aider certaines performances. Sinon, vous pouvez écrire une déclaration de cas comme vous voulez et dire quand la déclaration de cas = 1 puis rejoindre. Par exemple. (CASE WHEN department_cod = 'X' et MONTH (a) = MONTH (b) et YEAR (a) = YEAR (b) THEN 1 ELSE 0 END) = 1 – Matt