3 votes

Meilleure façon d'effectuer une jointure multiple dans cette requête SQL ?

J'essaie d'extraire des données d'une table (a.table) pour les joindre à une autre table (b.table). Pour ce faire, je dois joindre une troisième table (c.table) pour faire référence aux tables Plan_Code et Policy_Riders. Voir le code ci-dessous

USE [CDS]
GO

SELECT riders.ExpiryDt--
      ,riders.TerminationDt
      ,[ModalPremium]--
      ,plan_code
  FROM a.table as riders

  JOIN c.table as policy
  ON policy.Policy_Num = riders.Policy_Num

 JOIN b.table AS plan_code
  on policy.Plan_Code_ID = plan_code.Plan_Code_ID

WHERE plan_code.Plan_Code LIKE '%EIUL3%' 
OR plan_code.Plan_Code LIKE '%LBIUL%'
OR plan_code.Plan_Code LIKE '%MEIUL3%'  
GO

Pour obtenir le nom du champ Plan_code de b.table vers ma sortie, je dois d'abord joindre a.table à c.table, puis c.table à b.table. Ma question est la suivante : existe-t-il une meilleure façon d'aborder cette requête afin d'effectuer une meilleure jointure entre les trois tables ? Toute aide serait appréciée. Je vous remercie de votre aide.

1voto

Aaron Dietz Points 7838

Tout d'abord, utilisez une table dérivée pour les filtres :

...
JOIN (SELECT columns
      FROM b.table
      WHERE Plan_Code LIKE '%EIUL3%' 
         OR Plan_Code LIKE '%LBIUL%'
         OR Plan_Code LIKE '%MEIUL3%'
     ) AS plan_code ON policy.Plan_Code_ID = plan_code.Plan_Code_ID

Cela permet généralement de s'assurer que ces filtres sont appliqués au plus petit ensemble de données, plutôt qu'une fois que toutes les tables ont été réunies. Une autre option serait de faire de la table ci-dessus une table temporaire, puis de la joindre. Le concept est le même, il s'agit simplement d'aider l'optimiseur à travailler efficacement. Dans les petites requêtes, vous ne verrez aucune différence, mais dans les requêtes plus importantes (en particulier celles comme celle-ci, avec de nombreux filtres à partir d'une seule table), ce sera le jour et la nuit.

Deuxièmement, vos filtres en particulier. L'utilisation d'un LIKE avec des caractères génériques avant et arrière %ex% n'est pas bonne. Il ne pourra pas utiliser d'index. Utilisez un ex% ou l'autre %ex si possible.

Pour le reste, vos jointures sont correctes et constituent la bonne approche pour obtenir des colonnes de chaque table.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X