Filteren tijdens joinen

Queryprestaties verbeteren in PostgreSQL

Amy McCarty

Instructor

Joins herzien

 

Joins

  • Koppelen tabellen via minimaal 1 gemeenschappelijk veld
SELECT * 
FROM TABLE_A AS A
INNER JOIN TABLE_B AS B 
  ON A.NAME = B.NAME

 

Joins om data te combineren

  • Uit meerdere tabellen
  • Inner en outer

Joins om te filteren

  • Inner join
  • Outer join met niet-koppelende joinvoorwaarde
Queryprestaties verbeteren in PostgreSQL

Patiënten- en afsprakengegevens

Appointments
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
Queryprestaties verbeteren in PostgreSQL

Inner joins om te filteren

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

De patient_id 999 in de tabel Visits linkt aan patient_id 999 in de tabel Patients. De patient_id 888 in Visits linkt aan patient_id 888 in Patients. Patient_id 777 in Patients heeft geen link.

Queryprestaties verbeteren in PostgreSQL

Inner joins om te filteren

SELECT *
FROM appointments a
INNER JOIN patients p
ON a.patient_id = p.patient_id
Output
visit_id reason patient_id name sex
01 checkup 999 Lotte Smith F
02 infection 888 Zhang Wei M
Queryprestaties verbeteren in PostgreSQL

Outer joins om te filteren

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

De tabel Patients wordt gefilterd op Males, dus patiënt 888 Zhang Wei M is omcirkeld. Dit is het enige mannelijke record en dus het enige dat joint met een patient_id in de tabel Visits.

Queryprestaties verbeteren in PostgreSQL

Outer joins om te filteren

SELECT *
FROM appointments a
LEFT JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'
Output
visit_id reason patient_id name sex
01 checkup 999
02 infection 888 Zhang Wei M
Queryprestaties verbeteren in PostgreSQL

Valkuilen bij filteren

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

1) FROM De patient_id 999 in de tabel Visits linkt aan patient_id 999 in de tabel Patients. De patient_id 888 in Visits linkt aan patient_id 888 in Patients. Patient_id 777 in Patients heeft geen link.

 

 

 

 

2) WHERE Een tabel met het bezoek van 888 Zhang Wei en patiëntinfo als één rij, en het bezoek van 999 Lotte Smith en patiëntrecord als een tweede, doorgestreepte rij.

Queryprestaties verbeteren in PostgreSQL

Valkuilen bij filteren

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
Output
visit_id reason patient_id name sex
02 infection 888 Zhang Wei M
Queryprestaties verbeteren in PostgreSQL

Valkuilen bij filteren

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
Output
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
Queryprestaties verbeteren in PostgreSQL

Valkuilen bij filteren verbeterd

 

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'
Queryprestaties verbeteren in PostgreSQL

Laten we oefenen!

Queryprestaties verbeteren in PostgreSQL

Preparing Video For Download...