Filtrera vid join

Förbättra frågeprestanda i PostgreSQL

Amy McCarty

Instructor

Joins återbesökt

 

Joins

  • Kopplar tabeller via minst ett gemensamt fält
SELECT * 
FROM TABLE_A AS A
INNER JOIN TABLE_B AS B 
  ON A.NAME = B.NAME

 

Joins för att kombinera data

  • Från flera tabeller
  • Inner och outer

Joins för att filtrera data

  • Inner join
  • Outer join med icke-länkande joinvillkor
Förbättra frågeprestanda i PostgreSQL

Patient- och bokningsdata

Bokningar
visit_id reason patient_id
01 checkup 999
02 infection 888
Patienter
patient_id name sex
999 Lotte Smith F
888 Zhang Wei M
777 Amelia Hernandez F
Förbättra frågeprestanda i PostgreSQL

Inner joins för filtrering

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

Patient-id 999 i tabellen Visits länkas till patient-id 999 i tabellen Patients. Patient-id 888 i tabellen Visits länkas till patient-id 888 i tabellen Patients. Patient-id 777 i tabellen Patients har ingen länk.

Förbättra frågeprestanda i PostgreSQL

Inner joins för filtrering

SELECT *
FROM appointments a
INNER JOIN patients p
ON a.patient_id = p.patient_id
Utdata
visit_id reason patient_id name sex
01 checkup 999 Lotte Smith F
02 infection 888 Zhang Wei M
Förbättra frågeprestanda i PostgreSQL

Outer joins för filtrering

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

Tabellen Patients filtreras till män, och patient 888 Zhang Wei M är inringad. Det är den enda manliga posten och därmed den enda som kopplas till ett patient-id i tabellen Visits.

Förbättra frågeprestanda i PostgreSQL

Outer joins för filtrering

SELECT *
FROM appointments a
LEFT JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'
Utdata
visit_id reason patient_id name sex
01 checkup 999
02 infection 888 Zhang Wei M
Förbättra frågeprestanda i PostgreSQL

Filtreringsfällor

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

1) FROM Patient-id 999 i tabellen Visits länkas till patient-id 999 i tabellen Patients. Patient-id 888 i tabellen Visits länkas till patient-id 888 i tabellen Patients. Patient-id 777 i tabellen Patients har ingen länk.

 

 

 

 

2) WHERE En tabell med bokningen för 888 Zhang Wei och patientinformation som en rad, samt bokningen och patientposten för 999 Lotte Smith som en andra, överstruken rad.

Förbättra frågeprestanda i PostgreSQL

Filtreringsfällor

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
Utdata
visit_id reason patient_id name sex
02 infection 888 Zhang Wei M
Förbättra frågeprestanda i PostgreSQL

Filtreringsfällor

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
Utdata
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
Förbättra frågeprestanda i PostgreSQL

Förbättrade filtreringsfällor

 

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'
Förbättra frågeprestanda i PostgreSQL

Nu kör vi en övning!

Förbättra frågeprestanda i PostgreSQL

Preparing Video For Download...