Filtrování při spojování

Optimalizace výkonu dotazů v PostgreSQL

Amy McCarty

Instructor

Joiny znovu

 

Joiny

  • Propojují tabulky pomocí alespoň 1 společného pole
SELECT * 
FROM TABLE_A AS A
INNER JOIN TABLE_B AS B 
  ON A.NAME = B.NAME

 

Joiny pro kombinování dat

  • Z více tabulek
  • Inner a outer

Joiny pro filtrování dat

  • Inner join
  • Outer join s nepropojující podmínkou
Optimalizace výkonu dotazů v PostgreSQL

Data pacientů a návštěv

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
Optimalizace výkonu dotazů v PostgreSQL

Inner join pro filtrování

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

Patient_id 999 v tabulce Visits je propojen s patient_id 999 v tabulce Patients. Patient_id 888 v tabulce Visits je propojen s patient_id 888 v tabulce Patients. Patient_id 777 v tabulce Patients nemá žádné propojení.

Optimalizace výkonu dotazů v PostgreSQL

Inner join pro filtrování

SELECT *
FROM appointments a
INNER JOIN patients p
ON a.patient_id = p.patient_id
Výstup
visit_id reason patient_id name sex
01 checkup 999 Lotte Smith F
02 infection 888 Zhang Wei M
Optimalizace výkonu dotazů v PostgreSQL

Outer join pro filtrování

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

Tabulka Patients je filtrována na muže, takže obsahuje záznam pacienta 888 Zhang Wei M označený kroužkem. Jde o jediný mužský záznam, který se tedy jako jediný spojí s patient_id v tabulce Visits.

Optimalizace výkonu dotazů v PostgreSQL

Outer join pro filtrování

SELECT *
FROM appointments a
LEFT JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'
Výstup
visit_id reason patient_id name sex
01 checkup 999
02 infection 888 Zhang Wei M
Optimalizace výkonu dotazů v PostgreSQL

Úskalí filtrování

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

1) FROM Patient_id 999 v tabulce Visits je propojen s patient_id 999 v tabulce Patients. Patient_id 888 v tabulce Visits je propojen s patient_id 888 v tabulce Patients. Patient_id 777 v tabulce Patients nemá žádné propojení.

 

 

 

 

2) WHERE Tabulka s návštěvou 888 Zhang Wei a informacemi o pacientovi jako první řádek a návštěvou 999 Lotte Smith a záznamem pacienta jako druhý, přeškrtnutý řádek.

Optimalizace výkonu dotazů v PostgreSQL

Úskalí filtrování

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
Výstup
visit_id reason patient_id name sex
02 infection 888 Zhang Wei M
Optimalizace výkonu dotazů v PostgreSQL

Úskalí filtrování

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
Výstup
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
Optimalizace výkonu dotazů v PostgreSQL

Vylepšené filtrování

 

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'
Optimalizace výkonu dotazů v PostgreSQL

Pojďme si procvičit!

Optimalizace výkonu dotazů v PostgreSQL

Preparing Video For Download...