Tenho duas tabelas: A e B
UMA
provedor_id | encontro |
---|---|
111 | encontro |
222 | encontro |
333 | encontro |
B
provedor_id | status | encontro |
---|---|---|
111 | inicializado | encontro |
111 | lançado | encontro |
222 | fracassado | encontro |
O resultado que eu quero
provedor_id | status | encontro |
---|---|---|
111 | lançado | Um encontro |
222 | fracassado | Um encontro |
333 | nulo | Um encontro |
Entre as coisas que tentei é a junção esquerda
select *
from "A"
left join "B" on "B"."provider_id" = "A"."provider_id"
order by "A"."date" desc;
Mas eu tenho os registros duplicados com base emstatus
provedor_id | status | encontro |
---|---|---|
111 | inicializado | encontro |
111 | lançado | encontro |
222 | fracassado | encontro |
333 | nulo | encontro |
Existem muitas maneiras possíveis.
As melhores soluções (mais rápidas) dependem muito de definições de tabela exatas, consultas típicas (o que você precisa exatamente ? quais colunas? todas ou poucas linhas? filtradas como? ordenadas como? ...), recursos de banco de dados, versão do Postgres, índices, e por último, mas não menos importante, cardinalidades e distribuição de dados.
Supondo que você queira todas as linhas, de tabelas grandes com todas as colunas
NOT NULL
, integridade referencial não imposta com uma restrição FK, poucas duplicatas emB (provider_id)
, apenas índices de árvore B simples em(provider_id)
, e o resultado deve ser ordenado porprovider_id
, esta seria minha consulta:Ver:
Funciona em qualquer caso , mas pode haver consultas (muito) mais rápidas para outros casos...