[pgbr-geral] Consulta com 'NOT IN' devolve resultado não esperado

2013-01-10 Por tôpico Eloi Ribeiro
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

2013-01-10 Por tôpico Renan Fuentes
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

2013-01-10 Por tôpico Emerson Hermann
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

2013-01-10 Por tôpico Bruno Silva
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

2013-01-10 Por tôpico Eloi Ribeiro

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

2013-01-10 Por tôpico Dickson S. Guedes
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