Filtrare în timpul joinului

Îmbunătățirea performanței interogărilor în PostgreSQL

Amy McCarty

Instructor

Join-uri — recapitulare

 

Join-uri

  • Leagă tabele folosind cel puțin un câmp comun
SELECT * 
FROM TABLE_A AS A
INNER JOIN TABLE_B AS B 
  ON A.NAME = B.NAME

 

Join-uri pentru combinarea datelor

  • Din mai multe tabele
  • Inner și outer

Join-uri pentru filtrarea datelor

  • Inner join
  • Outer join cu condiție de join fără legătură
Îmbunătățirea performanței interogărilor în PostgreSQL

Date despre pacienți și programări

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
Îmbunătățirea performanței interogărilor în PostgreSQL

Inner join-uri pentru filtrare

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

ID-ul de pacient 999 din tabelul Visits se leagă de ID-ul 999 din tabelul Patients. ID-ul 888 din Visits se leagă de ID-ul 888 din Patients. ID-ul 777 din Patients nu are nicio legătură.

Îmbunătățirea performanței interogărilor în PostgreSQL

Inner join-uri pentru filtrare

SELECT *
FROM appointments a
INNER JOIN patients p
ON a.patient_id = p.patient_id
Rezultat
visit_id reason patient_id name sex
01 checkup 999 Lotte Smith F
02 infection 888 Zhang Wei M
Îmbunătățirea performanței interogărilor în PostgreSQL

Outer join-uri pentru filtrare

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

Tabelul Patients este filtrat după bărbați, astfel încât înregistrarea 888 Zhang Wei M este încercuită. Aceasta este singura înregistrare masculină, deci este singura care se leagă de un patient_id din tabelul Visits.

Îmbunătățirea performanței interogărilor în PostgreSQL

Outer join-uri pentru filtrare

SELECT *
FROM appointments a
LEFT JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'
Rezultat
visit_id reason patient_id name sex
01 checkup 999
02 infection 888 Zhang Wei M
Îmbunătățirea performanței interogărilor în PostgreSQL

Capcane la filtrare

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

1) FROM ID-ul de pacient 999 din tabelul Visits se leagă de ID-ul 999 din tabelul Patients. ID-ul 888 din Visits se leagă de ID-ul 888 din Patients. ID-ul 777 din Patients nu are nicio legătură.

 

 

 

 

2) WHERE Un tabel cu vizita 888 Zhang Wei și datele pacientului pe un rând, iar vizita 999 Lotte Smith cu înregistrarea pacientului pe al doilea rând, tăiat.

Îmbunătățirea performanței interogărilor în PostgreSQL

Capcane la filtrare

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
Rezultat
visit_id reason patient_id name sex
02 infection 888 Zhang Wei M
Îmbunătățirea performanței interogărilor în PostgreSQL

Capcane la filtrare

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
Rezultat
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
Îmbunătățirea performanței interogărilor în PostgreSQL

Capcane la filtrare — îmbunătățit

 

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'
Îmbunătățirea performanței interogărilor în PostgreSQL

Să exersăm!

Îmbunătățirea performanței interogărilor în PostgreSQL

Preparing Video For Download...