tutoriales - tutorial de sql server 2014
Servidor SQL-NO EN (6)
Necesito crear una consulta que me muestre los registros que se encuentran en la Tabla 1, pero que no están en la Tabla 2, en función de la combinación del número de serie del modelo de fabricación.
Sé de hecho que hay 4 registros que difieren, pero mi consulta siempre vuelve en blanco.
SELECT *
FROM Table1 WHERE MAKE+MODEL+[Serial Number] NOT IN
(SELECT make+model+[serial number] FROM Table2)
La Tabla 1 tiene 5 registros.
Cuando cambio la consulta a IN
, obtengo 1 registro. ¿Qué estoy haciendo mal con el NOT
?
Probablemente sea mejor que compare los campos individualmente, en lugar de concatenar las cadenas.
SELECT t1.*
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.MAKE = t2.MAKE
AND t1.MODEL = t2.MODEL
AND t1.[serial number] = t2.[serial number]
WHERE t2.MAKE IS NULL
Un problema podría ser que si make, model o [serial number] eran nulos, nunca se devolverían los valores. Debido a que las concatenaciones de cadenas con valores nulos siempre dan como resultado nulo, y no en () con nulo, siempre no devuelve nada. El remedio para esto es usar un operador como IsNull (make, '''') + IsNull (Model, ''''), etc.
Use una UNIÓN IZQUIERDA revisando el lado derecho para valores nulos.
SELECT a.Id
FROM TableA a
LEFT JOIN TableB on a.Id = b.Id
WHERE b.Id IS NULL
Lo anterior coincidiría con la Tabla A y la Tabla B basadas en la columna Id en cada una, y luego le daría las filas donde el lado B está vacío.
SELECT [T1].*
FROM [Table1] AS [T1]
WHERE NOT EXISTS (SELECT
1 AS [C1]
FROM [Table2] AS [T2]
WHERE ([T2].[MAKE] = [T1].[MAKE]) AND
([T2].[MODEL] = [T1].[MODEL]) AND
([T2].[Serial Number] = [T1].[Serial Number])
);
SELECT * FROM Table1
WHERE MAKE+MODEL+[Serial Number] not in
(select make+model+[serial number] from Table2
WHERE make+model+[serial number] IS NOT NULL)
Eso funcionó para mí, donde make+model+[serial number]
era un nombre de campo
Es por la forma en que NOT IN funciona .
Para evitar estos dolores de cabeza (y para una consulta más rápida en muchos casos), siempre prefiero NO EXISTE:
SELECT *
FROM Table1 t1
WHERE NOT EXISTS (
SELECT *
FROM Table2 t2
WHERE t1.MAKE = t2.MAKE
AND t1.MODEL = t2.MODEL
AND t1.[Serial Number] = t2.[serial number]);