Tenho duas tabelas, para simplificar vamos chamá-las employees
de e employee_comms
:
employee
:
eu ia | nome | departamento |
---|---|---|
1 | Jane | Manutenção |
2 | João | Projeto |
employee_comms
:
eu ia | ID do contato | tipo_de_comunicação | valor_de_comunicação |
---|---|---|---|
1 | 1 | [email protegido] | |
2 | 1 | telefone | 555 324 6573 |
3 | 2 | [email protegido] | |
4 | 2 | telefone | 555 201 5843 |
Atualmente, comms_type
só pode ser phone
ou email
.
Escrevi uma consulta para filtrar funcionários por departamento e mostrar e-mail e telefone de cada um:
SELECT
d.id,
d.name,
d.dept,
p.comms_value as phone,
e.comms_value as email
FROM
(
SELECT *
FROM employee
WHERE dept = 'Design'
) AS d
LEFT JOIN (
SELECT contact_id, comms_value
FROM employee_comms
WHERE comms_type = 'phone'
) AS p ON (d.id = p.contact_id)
LEFT JOIN (
SELECT contact_id, comms_value
FROM employee_comms
WHERE comms_type = 'email'
) AS e ON (d.id = e.contact_id);
O resultado é uma tabela onde a segunda tabela é transposta com linhas únicas e exclusivas onde nenhum employee
valor é duplicado ( id
, name
):
eu ia | nome | departamento | telefone | |
---|---|---|---|---|
2 | João | Projeto | [email protegido] | 555 201 5843 |
Atualmente, ele resolve minhas necessidades, mas continuo pensando que deveria haver uma solução mais eficiente, já que estou consultando a employee_comms
tabela duas vezes e isso pode se tornar um problema de desempenho quando a employee_comms
tabela ficar grande (e isso vai acontecer).
P: Existe uma abordagem mais eficiente?