[pgbr-geral] Consulta com 'NOT IN' devolve resultado não esperado
Ola a todos, Tenha duas tabelas com estações meteorológicas e quero saber quais são as estações que estão numa tabela (tmp_estaciones) mas não na outra (es_estaciones). Para tal executo a seguinte consulta: SELECT indicativo FROM sch_meteo.tmp_estaciones WHERE indicativo NOT IN ( SELECT codigo FROM sch_meteo.es_estaciones); -- 0 rows retrieved. De antemão eu sei que há estações em 'tmp_estaciones' que não estão em 'es_estaciones'. Assim que o resultado não deveria ser zero linhas. As seguintes consultas comprovam isso mesmo: SELECT indicativo FROM sch_meteo.tmp_estaciones WHERE indicativo = 'C917E'; -- 1 row retrieved. SELECT codigo FROM sch_meteo.es_estaciones WHERE codigo = 'C917E'; -- 0 rows retrieved. O quê que estou a fazer mal? Obrigado. Cumprimentos, Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Consulta com 'NOT IN' devolve resultado não esperado
Em 10 de janeiro de 2013 13:01, Eloi Ribeiro eloi.ribe...@gmail.comescreveu: Ola a todos, Tenha duas tabelas com estações meteorológicas e quero saber quais são as estações que estão numa tabela (tmp_estaciones) mas não na outra (es_estaciones). Para tal executo a seguinte consulta: SELECT indicativo FROM sch_meteo.tmp_estaciones WHERE indicativo NOT IN ( SELECT codigo FROM sch_meteo.es_estaciones); -- 0 rows retrieved. De antemão eu sei que há estações em 'tmp_estaciones' que não estão em 'es_estaciones'. Assim que o resultado não deveria ser zero linhas. As seguintes consultas comprovam isso mesmo: SELECT indicativo FROM sch_meteo.tmp_estaciones WHERE indicativo = 'C917E'; -- 1 row retrieved. SELECT codigo FROM sch_meteo.es_estaciones WHERE codigo = 'C917E'; -- 0 rows retrieved. O quê que estou a fazer mal? Obrigado. Cumprimentos, Eloi Eloi, Seria mais interessante você utilizar a combinação de consultas, no seu caso eu usaria o EXCEPT [1], resumindo seria: consulta1 EXCEPT [ALL] consulta2 (retorna todas as linhas presentes no resultado da consulta1) Ficando: SELECT indicativo FROM sch_meteo.tmp_estacione EXCEPT SELECT codigo FROM sch_meteo.es_estaciones; [1] http://www.postgresql.org/docs/current/static/sql-select.html Att -- *__ **Renan Catalani Fuentes de Campos* * E-mail: **renancfuen...@gmail.com** Skype:** renan_fuentes** * ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Consulta com 'NOT IN' devolve resultado não esperado
Olá Eloi, Deve ser observado que se o resultado da expressão à esquerda for nulo, ou se não houver nenhum valor igual à direita e uma das linhas à direita tiver o valor nulo, o resultado da construção NOT IN será nulo, e não verdade. Isto está de acordo com as regras normais do SQL para combinações booleanas de valores nulos. [1] Idem na versões demais versões do Postgres [2] Concluindo isso não é um bug mas sim um comportamento padrão do NOT IN, que está em conformidade com as normas SQL/ANSI, lembrando que uso de NOT IN não é recomendável quando se pensa em desempenho. E finalmente o banco (SGBDR em especial o Postgres) não mente! :) [3] Uma possível sugestão para o problema em questão seria usar a clausula EXCEPT ou EXCEPT ALL (subtração de consultas) ou ainda acrescentar no WHERE IS NOT NULL ( SELECT indicativo FROM sch_meteo.tmp_estaciones WHERE indicativo = 'C917E' -- 1 row retrieved. ) EXCEPT ( SELECT codigo FROM sch_meteo.es_estaciones WHERE codigo = 'C917E' -- 0 rows retrieved. ) ; [1] http://pgdocptbr.sourceforge.net/pg80/functions-subquery.html#FUNCTIONS-NOT-IN-SUBQ [2] http://www.postgresql.org/docs/9.0/static/functions-comparisons.html#AEN16842 [3] http://emersonhermann.blogspot.com.br/2011/04/o-moido-do-not-in-o-postgres-estaria.html Espero ter ajudado. Cordialmente, Emerson Hermann Em 10 de janeiro de 2013 12:01, Eloi Ribeiro eloi.ribe...@gmail.comescreveu: Ola a todos, Tenha duas tabelas com estações meteorológicas e quero saber quais são as estações que estão numa tabela (tmp_estaciones) mas não na outra (es_estaciones). Para tal executo a seguinte consulta: SELECT indicativo FROM sch_meteo.tmp_estaciones WHERE indicativo NOT IN ( SELECT codigo FROM sch_meteo.es_estaciones); -- 0 rows retrieved. De antemão eu sei que há estações em 'tmp_estaciones' que não estão em 'es_estaciones'. Assim que o resultado não deveria ser zero linhas. As seguintes consultas comprovam isso mesmo: SELECT indicativo FROM sch_meteo.tmp_estaciones WHERE indicativo = 'C917E'; -- 1 row retrieved. SELECT codigo FROM sch_meteo.es_estaciones WHERE codigo = 'C917E'; -- 0 rows retrieved. O quê que estou a fazer mal? Obrigado. Cumprimentos, Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Consulta com 'NOT IN' devolve resultado não esperado
O campo 'codigo' tem o mesmo valor que em 'indicativo'? Outro ponto, em caso de listas dinâmicas é indicado usar o Exists, tem uma performance melhor que o IN. Bruno E. A. Silva. Analista de Sistemas. Bacharel em Sistemas de Informação Pós-graduando em Gerência de Projetos Certified Scrum Master LPIC-1 SCJP, SE 6 Novell CLA / DCTS ECR DBA Postgres --- “A caixa dizia: Requer MS Windows ou superior. Então instalei Linux.” - Sábio Desconhecido Alguns prestam serviço/consultoria de Qualidade, os outros vendem licença! 2013/1/10 Renan Fuentes renancfuen...@gmail.com Em 10 de janeiro de 2013 13:01, Eloi Ribeiro eloi.ribe...@gmail.comescreveu: Ola a todos, Tenha duas tabelas com estações meteorológicas e quero saber quais são as estações que estão numa tabela (tmp_estaciones) mas não na outra (es_estaciones). Para tal executo a seguinte consulta: SELECT indicativo FROM sch_meteo.tmp_estaciones WHERE indicativo NOT IN ( SELECT codigo FROM sch_meteo.es_estaciones); -- 0 rows retrieved. De antemão eu sei que há estações em 'tmp_estaciones' que não estão em 'es_estaciones'. Assim que o resultado não deveria ser zero linhas. As seguintes consultas comprovam isso mesmo: SELECT indicativo FROM sch_meteo.tmp_estaciones WHERE indicativo = 'C917E'; -- 1 row retrieved. SELECT codigo FROM sch_meteo.es_estaciones WHERE codigo = 'C917E'; -- 0 rows retrieved. O quê que estou a fazer mal? Obrigado. Cumprimentos, Eloi Eloi, Seria mais interessante você utilizar a combinação de consultas, no seu caso eu usaria o EXCEPT [1], resumindo seria: consulta1 EXCEPT [ALL] consulta2 (retorna todas as linhas presentes no resultado da consulta1) Ficando: SELECT indicativo FROM sch_meteo.tmp_estacione EXCEPT SELECT codigo FROM sch_meteo.es_estaciones; [1] http://www.postgresql.org/docs/current/static/sql-select.html Att -- *__ **Renan Catalani Fuentes de Campos* * E-mail: **renancfuen...@gmail.com** Skype:** renan_fuentes** * ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Consulta com 'NOT IN' devolve resultado não esperado
Seria mais interessante você utilizar a combinação de consultas, no seu caso eu usaria o EXCEPT [1], resumindo seria: SELECT indicativo FROM sch_meteo.tmp_estacione EXCEPT SELECT codigo FROM sch_meteo.es_estaciones; Nao conecia o EXCEPT nem o comportamento padrão do NOT IN, estava a fazer uma interpretação literal. Com esta lista estamos sempre a aprender. Obrigado! Agora funciona na perfeição: SELECT indicativo FROM sch_meteo.tmp_estaciones EXCEPT SELECT codigo FROM sch_meteo.es_estaciones; -- 17 rows retrieved. Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Consulta com 'NOT IN' devolve resultado não esperado
Em 10 de janeiro de 2013 13:52, Eloi Ribeiro eloi.ribe...@gmail.com escreveu: Seria mais interessante você utilizar a combinação de consultas, no seu caso eu usaria o EXCEPT [1], resumindo seria: SELECT indicativo FROM sch_meteo.tmp_estacione EXCEPT SELECT codigo FROM sch_meteo.es_estaciones; Nao conecia o EXCEPT nem o comportamento padrão do NOT IN, estava a fazer uma interpretação literal. Com esta lista estamos sempre a aprender. Obrigado! Agora funciona na perfeição: SELECT indicativo FROM sch_meteo.tmp_estaciones EXCEPT SELECT codigo FROM sch_meteo.es_estaciones; -- 17 rows retrieved. Você pode dar uma olhada numa thread [1] que demonstra algumas coisas sobre esta questão. [1] http://listas.postgresql.org.br/pipermail/pgbr-geral/2012-June/031159.html []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