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