Фільтрування під час з'єднання

Покращення продуктивності запитів у PostgreSQL

Amy McCarty

Instructor

Повернімося до з'єднань

 

Joins

  • Поєднують таблиці за щонайменше 1 спільним полем
SELECT * 
FROM TABLE_A AS A
INNER JOIN TABLE_B AS B 
  ON A.NAME = B.NAME

 

З'єднання для об'єднання даних

  • З кількох таблиць
  • Внутрішні та зовнішні

З'єднання для фільтрування

  • Inner join
  • Outer join з нефільтрувальною умовою з'єднання
Покращення продуктивності запитів у PostgreSQL

Дані про пацієнтів і прийоми

Прийоми
visit_id reason patient_id
01 checkup 999
02 infection 888
Пацієнти
patient_id name sex
999 Lotte Smith F
888 Zhang Wei M
777 Amelia Hernandez F
Покращення продуктивності запитів у PostgreSQL

Внутрішні з'єднання для фільтрування

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

Ідентифікатор пацієнта 999 у таблиці Visits з'єднується з 999 у таблиці Patients. Ідентифікатор 888 у Visits з'єднується з 888 у Patients. Ідентифікатор 777 у таблиці Patients не має пари.

Покращення продуктивності запитів у PostgreSQL

Внутрішні з'єднання для фільтрування

SELECT *
FROM appointments a
INNER JOIN patients p
ON a.patient_id = p.patient_id
Результат
visit_id reason patient_id name sex
01 checkup 999 Lotte Smith F
02 infection 888 Zhang Wei M
Покращення продуктивності запитів у PostgreSQL

Зовнішні з'єднання для фільтрування

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

Таблиця Patients відфільтрована до чоловіків: виділено пацієнта 888 Zhang Wei M. Це єдиний чоловік, тож лише цей запис з'єднується з patient_id у таблиці Visits.

Покращення продуктивності запитів у PostgreSQL

Зовнішні з'єднання для фільтрування

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
Покращення продуктивності запитів у PostgreSQL

Підводні камені фільтрування

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

1) FROM Ідентифікатор пацієнта 999 у таблиці Visits з'єднується з 999 у таблиці Patients. Ідентифікатор 888 у Visits з'єднується з 888 у Patients. Ідентифікатор 777 у таблиці Patients не має пари.

 

 

 

 

2) WHERE Таблиця з візитом 888 Zhang Wei та даними пацієнта в одному рядку і другим рядком — візит 999 Lotte Smith та її запис — перекреслено.

Покращення продуктивності запитів у PostgreSQL

Підводні камені фільтрування

SELECT * 
FROM appointments a
LEFT 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
Покращення продуктивності запитів у PostgreSQL

Підводні камені фільтрування

SELECT * 
FROM appointments a
LEFT 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
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
Покращення продуктивності запитів у PostgreSQL

Як уникати підводних каменів фільтрування

 

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'
Покращення продуктивності запитів у PostgreSQL

Давайте потренуємось!

Покращення продуктивності запитів у PostgreSQL

Preparing Video For Download...