Oi Marcel,

> Não ficou muito claro para mim a reescrita de uma consulta.
> Como eu faria numa consulta como esta abaixo???

*Assumindo* que turmas_ofertas_professores tem o campo turma_oferta_id não
nulo
*e* que *todo* o professor tem uma referência à tabela pessoas, ficaria:

SELECT tof.id AS turma_oferta_id, tpo.id AS turma_professor_id, pf.id AS
professor_id, pf.cod_prof, ps.id, ps.nome_pessoa, sum(tpo.carga_horaria) AS
carga_horaria, sum(tpo.carga_horaria) * 0.2::double precision AS
horas_preparacao, d.id AS disciplina_id, d.cod_disciplina,
d.nome_disciplina, tof.nr_vagas, tof.cod_turma, tof.periodo_id
FROM turmas_ofertas tof
INNER JOIN disciplinas d ON tof.disciplina_id = d.id
INNER JOIN turmas_ofertas_professores tpo ON tpo.turma_oferta_id = tof.id
INNER JOIN professores pf ON tpo.professor_id = pf.id
INNER JOIN pessoas ps ON pf.pessoa_id = ps.id
GROUP BY tpo.id, tpo.carga_horaria, tof.id, tof.cod_turma, tof.nr_vagas,
tof.periodo_id, d.id, d.cod_disciplina, d.nome_disciplina, pf.id,
pf.cod_prof, ps.id, ps.nome_pessoa;*

UNION ALL

SELECT tof.id AS turma_oferta_id, tpo.id AS turma_professor_id, pf.id AS
professor_id, pf.cod_prof, ps.id, ps.nome_pessoa, sum(tpo.carga_horaria) AS
carga_horaria, sum(tpo.carga_horaria) * 0.2::double precision AS
horas_preparacao, d.id AS disciplina_id, d.cod_disciplina,
d.nome_disciplina, tof.nr_vagas, tof.cod_turma, tof.periodo_id
FROM turmas_ofertas tof
INNER JOIN disciplinas d ON tof.disciplina_id = d.id
WHERE NOT EXISTS( SELECT 1 FROM turmas_ofertas_professores tpo WHERE
tpo.turma_oferta_id = tof.id)

É de se esperar um ganho bem significativo com essa otimização.

Caso as premissas acima não sejam válidas, verifique se sua modelagem
realmente precisa ser assim e se prepare para ter até 7 UNION ALL seguindo um
critério similar ao exposto acima.

Mozart Hasse


_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a