Una rara con NOT IN

06/03/2008 - 11:00 por Pepe | Informe spam
tengo un expediente X

tengo dos tablas A y B

en cada una de ellas tengo varios campos, el comun es CODEMPLEADO.

Tengo una consulta de union con un LEFT JOIN que me devuelve registros NULL
para la parte B.

Select A.CAMPO1, B.CAMPO2
FROM A JOIN B ON ( A.CODEMPLEADO=B.CODEMPLEADO)

Hasta aqui es todo corrrecto.

Lo que quiero hacer es saber/predecir los registros que no cumpliran el LEFT
JOIN de manera que puedo tratar esos registros de otra manera. Para ello
habia pensado en romper la consulta en 2, los que cumplen el criterio y los
que no lo cumplen, y luego unirlas.

teniendo en cuenta que si hago un

SELECT DISTINCT CODEMPLEADO FROM A --> Me devuelve 100 registros
SELECT DISTINCT CODEMPLEADO FROM B --> Me devuelve 70 registros

esta claro que 30 registros de la tabla A no tienen coincidencia en la tabla
B

Para saber cuales seran esos 30 registros hice la siguiente consulta

SELECT A.CAMPO1, A.CODEMPLEADO
FROM A
WHERE A.CODEMPLEADO NOT IN ( SELECT B.CODEMPLEADO FROM B )

y lo curioso es que me devuelve 0 registros.

He probado tambien con NOT EXISTS y lo mismo.. 0 registros.

Los campos CODEMPLEADO estan presentes en las dos tablas, con el mismo tipo
de datos y con un indice para cada uno de ellos...

No se que puede estar pasando.. nunca me habia encontrado con un NOT IN que
no me devolveria los datos correctamente...

Muchas gracias por la ayuda
 

Leer las respuestas

#1 jcac
06/03/2008 - 15:14 | Informe spam
Hola Pepe,

Asumo que tu instruccion not exists fue asi:

Select a.campo1, a.codempleado from a
where not exists (select 1 from tabla b where a.codempleado = b.codempleado)

Hay que tener que los campos que comparas sean iguales o del mismo tipo de
dato, por ejemplo:

create table #a (codempleado char(10), campo int)
create table #b (codempleado char(20), campo int)
go
insert into #a values (' 1 ', 1)
insert into #a values (' 2 ', 2)
insert into #a values (' 3 ', 3)
insert into #b values ('1 ', 1)
insert into #b values ('3 ', 3)
insert into #b values ('4 ', 4)
go
select * from #a a where not exists (select 1 from #b b where a.codempleado
= b.codempleado)
go
select * from #a a where not exists (select 1 from #b b where a.campo =
b.campo)
go
select * from #a
select * from #b
go
drop table #a
drop table #b
go

Saludos

Juan Carlos
"Pepe" escribió en el mensaje
news:

tengo un expediente X

tengo dos tablas A y B

en cada una de ellas tengo varios campos, el comun es CODEMPLEADO.

Tengo una consulta de union con un LEFT JOIN que me devuelve registros
NULL para la parte B.

Select A.CAMPO1, B.CAMPO2
FROM A JOIN B ON ( A.CODEMPLEADO=B.CODEMPLEADO)

Hasta aqui es todo corrrecto.

Lo que quiero hacer es saber/predecir los registros que no cumpliran el
LEFT JOIN de manera que puedo tratar esos registros de otra manera. Para
ello habia pensado en romper la consulta en 2, los que cumplen el criterio
y los que no lo cumplen, y luego unirlas.

teniendo en cuenta que si hago un

SELECT DISTINCT CODEMPLEADO FROM A --> Me devuelve 100 registros
SELECT DISTINCT CODEMPLEADO FROM B --> Me devuelve 70 registros

esta claro que 30 registros de la tabla A no tienen coincidencia en la
tabla B

Para saber cuales seran esos 30 registros hice la siguiente consulta

SELECT A.CAMPO1, A.CODEMPLEADO
FROM A
WHERE A.CODEMPLEADO NOT IN ( SELECT B.CODEMPLEADO FROM B )

y lo curioso es que me devuelve 0 registros.

He probado tambien con NOT EXISTS y lo mismo.. 0 registros.

Los campos CODEMPLEADO estan presentes en las dos tablas, con el mismo
tipo de datos y con un indice para cada uno de ellos...

No se que puede estar pasando.. nunca me habia encontrado con un NOT IN
que no me devolveria los datos correctamente...

Muchas gracias por la ayuda




Preguntas similares