Em 22 de junho de 2012 20:51, Dickson S. Guedes <lis...@guedesoft.net> escreveu:
> Em 22 de junho de 2012 17:55, Matheus de Oliveira
> <matioli.math...@gmail.com> escreveu:
>> Mas só pra deixar mais claro, acho que seu exemplo seria adaptado com
>> subconsulta correlacionada da seguinte forma:
>>
>> SELECT Nome
>>        FROM Editora E
>>        WHERE Codigo IN (SELECT Editora
>>            FROM Livro
>>            WHERE Lancamento IS NOT NULL AND E.CODIGO = Livro.Editora)
>>
>> E aí um EXISTS cairia muito bem:
>>
>> SELECT Nome
>>        FROM Editora E
>>        WHERE EXISTS(SELECT 1
>>            FROM Livro
>>            WHERE Lancamento IS NOT NULL AND E.CODIGO = Livro.Editora)
>>
>> Deu pra entender?
>
> Apenas fazendo um adendo o efeito do EXISTS pode ser obtido com JOIN
> quando o relacionamento é 1..1, o plano de execução é quase sempre o
> mesmo, já quando o relacionamento é 1..* é possível também, mas um
> DISTINCT seria necessário e o plano ficaria um pouco diferente, mas
> equivalente.

Depois lendo o que escrevi, achei que ficou meio confuso, então tentei
fazer um exemplo no sqlfiddle [1], vejam os EXPLAINs das consultas e
comparem.

Vejam que para o segundo e o terceiro SELECT os planos são os mesmos
e em relação ao último, com JOIN, existe apenas um passo a mais
(HashAggregate) por conta do DISTINCT.


[1] http://sqlfiddle.com/#!1/8c26b/8

[]s
-- 
Dickson S. Guedes
mail/xmpp: gue...@guedesoft.net - skype: guediz
http://guedesoft.net - http://www.postgresql.org.br
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a