Olá Mozart, estava tentando reescrever uma consulta agora a pouco, tentando aplicar essas sugestões.
Porém, se eu executasse desse jeito que está no exemplo, ele não reclamaria que está faltando entrada para a tabela ps e pf no segundo select? E se eu colocasse os inners para essas tabelas não precisaria fazer o UNION ALL... fiquei confusa. -- Atenciosamente, Priscila Cardoso Gonçalves http://meadiciona.com.br/prinity Linux User: #415920 Considere a proteção ao meio ambiente antes de imprimir esse e-mail. Em 20 de maio de 2010 12:39, Mozart Hasse <mozart.ha...@usa.net> escreveu: > 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 > pgbr-geral@listas.postgresql.org.br > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral >
_______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral