Identificar qué valores NO coinciden con una fila de la tabla

10

Me gustaría poder verificar fácilmente qué identificadores únicos no existen en una tabla, de los que se proporcionan en una consulta.

Para explicar mejor, esto es lo que haría ahora, para verificar qué ID de la lista "1, 2, 3, 4" no existen en una tabla:

  1. SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4'), digamos que la tabla no contiene fila con ID 2.
  2. Volcar los resultados en Excel
  3. Ejecute una BUSQUEDA en la lista original que busca cada valor de lista en la lista de resultados.
  4. Cualquier BUSQUEDA que resulte en un #N/Aestá en un valor que no ocurrió en la tabla.

Creo que tiene que haber una mejor manera de hacer esto. Estoy buscando, idealmente, algo como

Lista para verificar -> Consulta en la tabla para verificar -> Miembros de la lista que no están en la tabla

NReilingh
fuente
¿No nos haga adivinar la versión de SQL Server?
Aaron Bertrand
Disculpas [editado] Es viejo. El problema con NOT IN es que devolverá todo lo demás en la tabla ...
NReilingh

Respuestas:

14

Uso EXCEPT:

SELECT * FROM
  (values (1),(2),(3),(4)) as T(ID)
EXCEPT
SELECT ID 
FROM [TABLE];

Ver SqlFiddle .


El valuesconstructor solo funcionará en SQL Server 2008 o posterior. Para 2005, use

SELECT 'value'
UNION SELECT 'value'

como se detalla en esta respuesta SO .

Remus Rusanu
fuente
Whoops, debería haber especificado. ¿Qué pasa si la identificación es un varchar?
NReilingh
1
@NReilingh luego rediseña tu DB :) pero creo que debería funcionar igual
JNK
Sigo recibiendo Incorrect syntax near the keyword 'values'.cuando SELECT * FROM (values ('search string'),('other string')) as T(ID)
corro
Su sintaxis funciona bien para mí en SQL Server 2008r2: pegué su comentario y se ejecutó.
JNK
Estoy en 2005. Cristo.
NReilingh
6

Construiría una variable de tabla o tabla temporal que contenga los ID que está buscando ... luego use la solución de Remus, menos el azúcar sintáctico de 2008:

declare @t table (ID int)
insert into @t values (1)
insert into @t values (2)
insert into @t values (3)
insert into @t values (4)
insert into @t values (5)

select ID from @t
except
select ID
from [Table];
Michael Fredrickson
fuente
3

Ahora soy un par de años más sabio (y tengo un SQL Server más nuevo) que cuando hice esta pregunta, así que para celebrar la insignia de Pregunta famosa que recibí por preguntar esto, esto es lo que haría ahora. (No creo haber usado el EXCEPToperador desde entonces).

Diría que el LEFT JOINsiguiente método es más útil que EXCEPTya que puede componerlo con otras combinaciones sin necesidad de un CTE.

SELECT v.val
  FROM (VALUES (1), (2), (3), (4), (5)) v (val)
    LEFT JOIN dbo.SomeTable t
      ON t.id = v.val
  WHERE t.id IS NULL;
NReilingh
fuente