Em 22 de junho de 2012 17:55, Matheus de Oliveira
<matioli.math...@gmail.com> escreveu:
> Pra ser uma consulta correlacionada não precisa ter o EXISTS, basta que
> tenha referência ao campo da consulta externa na interna.
>
>
>> SELECT Nome
>>        FROM Editora E
>>        WHERE Codigo IN (SELECT Editora
>>                                   FROM Livro
>>                                   WHERE Lancamento IS NOT NULL AND
>> E.CODIGO = 3)
>
>
>
> Geralmente quando isso ocorre, usamos o campo externo para comparar com
> algum valor de um campo interno, no seu exemplo você compara com uma
> constante, logo seria a mesma coisa (só que abaixo é mais eficiente) que:
>
>
> SELECT Nome
>        FROM Editora E
>        WHERE Codigo IN (SELECT Editora
>            FROM Livro
>            WHERE Lancamento IS NOT NULL)
>        AND E.CODIGO = 3
>
> 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.

[]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