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

Responder a