Correção: Seria assim:
SELECT "campoA", "campoB", null as c FROM a INNER JOIN b ON (a.id= b.id) UNION all SELECT "campoA", null as b, null as c FROM a WHERE NOT EXISTS (SELECT 1 FROM b WHERE a.id= b.id) UNION all SELECT "campoA", null as b, "campoC" FROM a INNER JOIN c ON (a.id= c.id) UNION all SELECT "campoA", null as b, null as c FROM a WHERE NOT EXISTS (SELECT 1 FROM c WHERE a.id= c.id) Ocorreu duas linhas por registro. mateusgra wrote: > > Seria assim: > > CREATE VIEW vw_uniao as > SELECT campoA, campoB, null as c FROM a INNER JOIN b ON (a.id= b.id) > UNION ALL > SELECT campoA, campoB, null as c FROM a WHERE NOT EXISTS (SELECT 1 FROM a > WHERE a.id= b.id) > UNION ALL > SELECT campoA, null as b, campoC FROM a INNER JOIN c ON (a.id= c.id) > UNION ALL > SELECT campoA, null as b, campoC FROM a WHERE NOT EXISTS (SELECT 1 FROM a > WHERE a.id= c.id) > > Ocorreu duas linhas por regitros quando tem registro so em A e C ou A e > B. > > > Mozart Hasse wrote: >> >> Olá Vinicius, >> >>> From: vinicius perroni <vinicius...@gmail.com> >>> Subject: [pgbr-geral] Otimizar consulta com LEFT JOIN >> >>> Estou com um velho problema uma consulta minha utiliza muitos LEFT >>> JOINS tornandoa lenta demais. >> >>> A consulta é mais ou menos assim tenho uma tabela de orçamentos, uma >>> de ordens de compras e outra de Notas Fiscas, três tabelas sendo o >>> unico registro que certamente existe é o orçamento. Junto elas com >>> LEFT JOIN ... >> >>> Pensei em usar UNION mas ainda não realizei testes alguem tem alguma >>> ideia para substituir os LEFT JOINS e otimizar a consulta? >> >> Aplique a idéia de usar UNION ALL. Isso funciona em qualquer servidor SQL >> e >> nunca vi piorar o desempenho da consulta. O que faço é o seguinte: para >> CADA >> LEF OUTER JOIN da sua consulta, substitua por duas cópias da mesma query >> separadas por UNION ALL (não union, tem de ser UNION ALL), sendo que numa >> delas você vai trocar o LEFT OUTER JOIN por um INNER JOIN e na outra você >> vai tirar fora o LEFT OUTER da tabela e incluir lá na cláusula WHERE a >> condição AND NOT EXISTS(SELECT 1 FROM <suatabeladoleft> WHERE <joins que >> estavam no LEFT>). Provavelmente você vai notar que ao por INNER na >> tabela >> que antes era OUTER você poderá trocar um monte de OUTERs por INNERs nas >> tabelas filhas dela também, o que ajudará ainda mais a melhorar o >> desempenho. >> >> A implicação disso é que, se tua query tem 2 LEFT OUTER, a combinação de >> todos com todos vai resultar em 4 consultas separadas por UNION ALL. >> Nunca >> precisei de mais do que 8. Não se assuste porque valerá a pena. >> Sua query vai ficar grande, porém mesmo seis vezes maior ainda ficará >> muito >> mais rápida que a original. Faço isso aqui direto com ótimos resultados. >> Minha aplicação não sofreu nenhuma alteração na modelagem por conta >> disso, porém com essas trocas para UNION ALL, o LEFT OUTER JOIN está >> virando >> lenda por aqui, praticamente ninguém mais usa. >> >> Atenciosamente, >> >> Mozart Hasse >> >> >> _______________________________________________ >> pgbr-geral mailing list >> pgbr-geral@listas.postgresql.org.br >> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral >> >> > > -- View this message in context: http://old.nabble.com/Otimizar-consulta-com-LEFT-JOIN-tp28583265p28604052.html Sent from the PostgreSQL - Brasil mailing list archive at Nabble.com. _______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral