GARANTIR DESCONTO

Fórum comportamento do NOT IN no 10g R2 #28350

03/02/2006

0

Salve nação

Estou diante de um comportamento estranho do NOT IN. Tenho o seguinte select:

SELECT * FROM SEGURANCA.TBL_GRUPO
WHERE CD_GRUPO NOT IN
(
SELECT CD_GRUPO
FROM SEGURANCA.TBL_GRUPO_USUARIO
WHERE CD_USUARIO IS NULL
)
ORDER BY TX_GRUPO

Se a subconsulta não retornar nenhuma linha, todos os registros da tabela serão retornados na consulta principal.
Se houver, pelo menos, um registro NULL na subconsulta, cosequentemente a consulta principal nao retornará nenhuma linha.

Sei que a subconsulta não retorna nenhuma linha, ou seja, não há nenhum CD_USUÁRIO com valor NULL. Então todos os registros da principal são retornados. Bom.. isso só NÃO acontece na versão 10g R2.

Usando a mesma base nas versões 9i e 10g R1, o resultado do select é o mesmo: traz todos os registros da tabela. Somanete na versão 10g R2 ele não traz nenhum registro.

Para desencargo utilizei o NOT EXISTS. Com esse método eu consigo o mesmo resultado tanto no 9i, 10g R1 e 10g R2, trazendo os mesmo registros da consulta com o NOT IN.

Porque o NOT IN no 10g R2 está com esse comportamento???????

Ouvi dizer que saiu uma reportagem sobre esse comportamento na Oracle Magazine.

Alguem ja passou por algo assim e consegui alguma explicação e/ou solução para o NOT IN trazer os resultados esperados?

Gustavo Salles


Sallesg

Sallesg

Responder

Posts

17/02/2006

Rosterne

Dei uma olhada na documentação da Oracle e achei a seguinte informação.

´Se qualquer item da lista do operador NOT IN for equivalente a NULL, então todas as linhas equivale a FALSE ou UNKNOWN e nehuma linha é retornada.´

link: http://download-east.oracle.com/docs/cd/B19306_01/server.102/b14200/conditions013.htm#i1050801


Abraço.


Responder

Gostei + 0

17/02/2006

Sallesg

Então Renato, mas ai é que está a questão. A subconsulta não retorna nenhum valor. A diferença é que no 10g R1, ou inferior, ele retorna todas as linhas da consulta principal, enquanto que no 10gR2, a mesma consulta com a mesma base, não retorna nada na sub consulta e na principal, quando deveria trazer tudo, não traz nada...

Isso que me intriga.


Responder

Gostei + 0

20/02/2006

Rosterne

Salles, olhei também na documentação da versão 10g release 1 e fala a mesma coisa.

http://download-west.oracle.com/docs/cd/B14117_01/server.101/b10759/conditions010.htm#sthref950

Fiz também um teste aqui nas versões 9.2.0.6.0 e 10.2.0.1.0 e tendo como query :

select department_id from employees where
department_id not in
(
select department_id from departments where department_name is null)
order by 1
;

ou seja, tendo uma subconsulta que não retorna registro e com uma condição NULL.

ambas retornaram todos os registros q a subconsulta não retornou.


Faça esse teste com essa query aí também.

espero ter ajudado.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar