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 <[email protected]>escreveu:
> 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
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral