Fórum comportamento do NOT IN no 10g R2 #28350
03/02/2006
0
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
Curtir tópico
+ 0Posts
17/02/2006
Rosterne
´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.
Gostei + 0
17/02/2006
Sallesg
Isso que me intriga.
Gostei + 0
20/02/2006
Rosterne
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)