v17 tutoriales tutorial transact engine sql sql-server tsql notin

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]);