Em 7 de abril de 2015 11:14, Alessandro Lima <[email protected]> escreveu:
>>>Antes de continuar, todos estes LEFT JOINs estão certos? A intenção é
> usá-los mesmo?
> Sim, a intenção é essa.
Você está buscando em algumas tabelas o registro mais recente de cada
prospect (como na tabela interacaoworkflow).
Estas tabelas se beneficiariam muito de um índice composto contendo o
campo data e o id/codigo nesta sequencia exata, melhorando a
seletividade.
Exemplo: CREATE INDEX ie_datainicio_prospect ON interacaoworkflow
(datainicio DESC, prospect)
Sobre a consulta, eu reescreveria a query deixando os relacionamentos
limpos nos LEFT JOINS e colocaria a condição para buscar o registro
mais atual de todas as tabelas no WHERE do SELECT principal, como no
exemplo:
Trocando isto:
FROM prospects
LEFT JOIN pessoa AS pessoaProspect
ON pessoaProspect.codigo = prospects.pessoa
LEFT JOIN interacaoworkflow ON
interacaoworkflow.codigo = (
SELECT
iwf.codigo
FROM
interacaoworkflow iwf
WHERE
prospects.codigo = iwf.prospect
ORDER BY
datainicio
DESC LIMIT 1
)
Por isto:
FROM prospects
LEFT JOIN pessoa AS pessoaProspect
ON pessoaProspect.codigo = prospects.pessoa
LEFT JOIN interacaoworkflow ON
interacaoworkflow.prospect = prospects.codigo
...
WHERE
(
interacaoworkflow.datainicio =
(
SELECT
MAX(iwf.datainicio)
FROM
interacaoworkflow iwf
WHERE
prospects.codigo = iwf.prospect
ORDER BY
iwf.datainicio DESC
)
)
Alterando também para a tabela cursointeresse e demais que fazem a
seleção pelo registro mais atual.
TIAGO J. ADAMI
http://www.adamiworks.com
@tiadami
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral