Filtrer lors des jointures

Améliorer les performances des requêtes dans PostgreSQL

Amy McCarty

Instructor

Retour sur les jointures

 

Jointures

  • Relier des tables via au moins 1 champ commun
SELECT * 
FROM TABLE_A AS A
INNER JOIN TABLE_B AS B 
  ON A.NAME = B.NAME

 

Jointures pour combiner les données

  • Depuis plusieurs tables
  • Interne et externe

Jointures pour filtrer les données

  • Jointure interne
  • Jointure externe avec condition de jointure non correspondante
Améliorer les performances des requêtes dans PostgreSQL

Données patients et rendez-vous

Rendez-vous
visit_id reason patient_id
01 checkup 999
02 infection 888
Patients
patient_id name sex
999 Lotte Smith F
888 Zhang Wei M
777 Amelia Hernandez F
Améliorer les performances des requêtes dans PostgreSQL

Filtrer avec des jointures internes

SELECT *
FROM appointments a
INNER JOIN patients p
ON a.patient_id = p.patient_id

L'ID patient 999 dans la table Visits est lié à l'ID patient 999 dans la table Patients. L'ID patient 888 dans la table Visits est lié à l'ID patient 888 dans la table Patients. L'ID patient 777 dans la table Patients n'a aucun lien.

Améliorer les performances des requêtes dans PostgreSQL

Filtrer avec des jointures internes

SELECT *
FROM appointments a
INNER JOIN patients p
ON a.patient_id = p.patient_id
Résultat
visit_id reason patient_id name sex
01 checkup 999 Lotte Smith F
02 infection 888 Zhang Wei M
Améliorer les performances des requêtes dans PostgreSQL

Filtrer avec des jointures externes

SELECT *
FROM appointments a
LEFT JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'

La table Patients est filtrée sur les hommes ; le patient 888 Zhang Wei M est entouré. C'est le seul enregistrement masculin, donc le seul à se joindre à un ID patient dans la table Visits.

Améliorer les performances des requêtes dans PostgreSQL

Filtrer avec des jointures externes

SELECT *
FROM appointments a
LEFT JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'
Résultat
visit_id reason patient_id name sex
01 checkup 999
02 infection 888 Zhang Wei M
Améliorer les performances des requêtes dans PostgreSQL

Pièges des filtres

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'

1) FROM L'ID patient 999 dans la table Visits est lié à l'ID patient 999 dans la table Patients. L'ID patient 888 dans la table Visits est lié à l'ID patient 888 dans la table Patients. L'ID patient 777 dans la table Patients n'a aucun lien.

 

 

 

 

2) WHERE Un tableau avec, sur une ligne, la visite 888 de Zhang Wei et ses informations patients, et sur une seconde ligne (barrée), la visite 999 de Lotte Smith et son enregistrement patient.

Améliorer les performances des requêtes dans PostgreSQL

Pièges des filtres

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
Résultat
visit_id reason patient_id name sex
02 infection 888 Zhang Wei M
Améliorer les performances des requêtes dans PostgreSQL

Pièges des filtres

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
Résultat
visit_id reason patient_id name sex
02 infection 888 Zhang Wei M
SELECT *
FROM appointments a
LEFT JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'
visit_id reason patient_id name sex
01 checkup 999
02 infection 888 Zhang Wei M
Améliorer les performances des requêtes dans PostgreSQL

Mieux éviter les pièges de filtrage

 

SELECT *
FROM appointments a
INNER JOIN patients p
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
visit_id reason patient_id name sex
02 infection 888 Zhang Wei M

 

SELECT *
FROM appointments a
INNER JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'
Améliorer les performances des requêtes dans PostgreSQL

Passons à la pratique !

Améliorer les performances des requêtes dans PostgreSQL

Preparing Video For Download...