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