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

Responder a