Filtrer lors des jointures

Améliorer la performance des requêtes dans PostgreSQL

Amy McCarty

Instructor

Revoir les jointures

 

Jointures

  • Lier des tables avec 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

  • De plusieurs tables
  • Interne et externe

Jointures pour filtrer

  • Jointure interne
  • Jointure externe avec condition de liaison non correspondante
Améliorer la performance des requêtes dans PostgreSQL

Données des patients et des 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 la performance 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'identifiant patient 999 dans la table Visits est lié à l'identifiant 999 dans la table Patients. L'identifiant 888 dans Visits est lié à l'identifiant 888 dans Patients. L'identifiant 777 dans Patients n'a aucun lien.

Améliorer la performance 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 la performance 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 aux hommes ; seul 888 Zhang Wei M est encerclé. C'est le seul enregistrement masculin, donc le seul qui se joint à un patient_id dans Visits.

Améliorer la performance 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 la performance des requêtes dans PostgreSQL

Pièges de filtrage

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

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

 

 

 

 

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

Améliorer la performance des requêtes dans PostgreSQL

Pièges de filtrage

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 la performance des requêtes dans PostgreSQL

Pièges de filtrage

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 la performance 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 la performance des requêtes dans PostgreSQL

Passons à la pratique !

Améliorer la performance des requêtes dans PostgreSQL

Preparing Video For Download...