Filtrando enquanto faz joins

Melhorando o Desempenho de Consultas no PostgreSQL

Amy McCarty

Instructor

Revisão de joins

 

Joins

  • Conectam tabelas usando pelo menos 1 campo em comum
SELECT * 
FROM TABLE_A AS A
INNER JOIN TABLE_B AS B 
  ON A.NAME = B.NAME

 

Joins para combinar dados

  • De várias tabelas
  • Inner e outer

Joins para filtrar dados

  • Inner join
  • Outer join com condição de junção não vinculante
Melhorando o Desempenho de Consultas no PostgreSQL

Dados de pacientes e consultas

Consultas
visit_id reason patient_id
01 checkup 999
02 infection 888
Pacientes
patient_id name sex
999 Lotte Smith F
888 Zhang Wei M
777 Amelia Hernandez F
Melhorando o Desempenho de Consultas no PostgreSQL

Inner joins para filtrar

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

O patient_id 999 na tabela Visits liga ao patient_id 999 na tabela Patients. O patient_id 888 na tabela Visits liga ao patient_id 888 na tabela Patients. O patient_id 777 na tabela Patients não tem ligação.

Melhorando o Desempenho de Consultas no PostgreSQL

Inner joins para filtrar

SELECT *
FROM appointments a
INNER JOIN patients p
ON a.patient_id = p.patient_id
Saída
visit_id reason patient_id name sex
01 checkup 999 Lotte Smith F
02 infection 888 Zhang Wei M
Melhorando o Desempenho de Consultas no PostgreSQL

Outer joins para filtrar

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

A tabela Patients é filtrada para homens, então o paciente 888 Zhang Wei M está circulado. Este é o único registro masculino, logo é o único que faz join com um patient_id na tabela Visits.

Melhorando o Desempenho de Consultas no PostgreSQL

Outer joins para filtrar

SELECT *
FROM appointments a
LEFT JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'
Saída
visit_id reason patient_id name sex
01 checkup 999
02 infection 888 Zhang Wei M
Melhorando o Desempenho de Consultas no PostgreSQL

Armadilhas ao filtrar

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

1) FROM O patient_id 999 na tabela Visits liga ao patient_id 999 na tabela Patients. O patient_id 888 na tabela Visits liga ao patient_id 888 na tabela Patients. O patient_id 777 na tabela Patients não tem ligação.

 

 

 

 

2) WHERE Uma tabela com a visita de 888 Zhang Wei e os dados do paciente em uma linha, e a visita de 999 Lotte Smith e o registro do paciente como segunda linha, riscada.

Melhorando o Desempenho de Consultas no PostgreSQL

Armadilhas ao filtrar

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
Saída
visit_id reason patient_id name sex
02 infection 888 Zhang Wei M
Melhorando o Desempenho de Consultas no PostgreSQL

Armadilhas ao filtrar

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
Saída
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
Melhorando o Desempenho de Consultas no PostgreSQL

Armadilhas ao filtrar, versão melhorada

 

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'
Melhorando o Desempenho de Consultas no PostgreSQL

Vamos praticar!

Melhorando o Desempenho de Consultas no PostgreSQL

Preparing Video For Download...