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

Preguntas similare

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




Respuesta Responder a este mensaje
#2 Alejandro Mesa
08/03/2008 - 19:25 | Informe spam
Pepe,

Asegurate que no estes seleccionando algun valor NULL de el lado de B. Si
existe un valor NULL, entonces la expresion da como resultado NULL
(desconocido). Fijate en este 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)

INSERT INTO #b VALUES (null, null)
go

SELECT *
FROM #a AS a
WHERE a.codempleado NOT IN (
SELECT b.codempleado
FROM #b AS b
)
GO

SELECT *
FROM #a AS a
WHERE a.codempleado NOT IN (
SELECT b.codempleado
FROM #b AS b
WHERE b.codempleado IS NOT NULL
)
GO

DROP TABLE #a, #b
GO


AMB


"Pepe" wrote:


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





Respuesta Responder a este mensaje
#3 Pepe
10/03/2008 - 09:34 | Informe spam
Ante todo, gracias a los dos.
Sin haberlo probado todavia estoy seguro de que es por lo que comentas ya
que en la tabla B hay registros NULL seguro y desconocia que una sentencia
NOT IN devolveria 0 registros si un elemento de la subconsulta es NULL.

Muchas gracias por la ayuda.


"Alejandro Mesa" escribió en el
mensaje news:
Pepe,

Asegurate que no estes seleccionando algun valor NULL de el lado de B. Si
existe un valor NULL, entonces la expresion da como resultado NULL
(desconocido). Fijate en este 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)

INSERT INTO #b VALUES (null, null)
go

SELECT *
FROM #a AS a
WHERE a.codempleado NOT IN (
SELECT b.codempleado
FROM #b AS b
)
GO

SELECT *
FROM #a AS a
WHERE a.codempleado NOT IN (
SELECT b.codempleado
FROM #b AS b
WHERE b.codempleado IS NOT NULL
)
GO

DROP TABLE #a, #b
GO


AMB


"Pepe" wrote:


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





email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida