识别哪些值与表格行不匹配


10

我希望能够轻松地检查表中不存在查询中提供的唯一标识符。

为了更好地解释,这是我现在要执行的操作,以检查表中不存在列表“ 1、2、3、4”的哪些ID:

  1. SELECT * FROM dbo."TABLE" WHERE "ID" IN ('1','2','3','4'),假设该表格不包含ID为2的行。
  2. 将结果转储到Excel
  3. 在原始列表上运行VLOOKUP,以搜索结果列表中的每个列表值。
  4. 任何导致的VLOOKUP都#N/A位于表中未出现的值上。

我在想必须有一种更好的方法来做到这一点。理想情况下,我正在寻找类似

要检查的列表->在表上查询以检查->列表中的成员不在表中


请不要让我们猜测SQL Server的版本?
亚伦·伯特兰


道歉。[编辑]很老了。NOT IN的问题在于它将返回表中的所有其他内容……
NReilingh 2013年

Answers:


14

用途EXCEPT

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

参见SqlFiddle


values构造函数将只SQL Server 2008或更高版本上运行。2005年使用

SELECT 'value'
UNION SELECT 'value'

该SO答案中所述


哎呀,应该指定。如果ID是varchar怎么办?
NReilingh

1
@NReilingh然后重新设计您的数据库:),但它应该与我认为的一样工作
JNK

我一直Incorrect syntax near the keyword 'values'.在跑步时得到SELECT * FROM (values ('search string'),('other string')) as T(ID)
动力

在SQL Server 2008r2中,您的语法对我来说很好用-我在其中粘贴了您的注释并运行了。
JNK 2013年

我在2005年。基督。
NReilingh

6

我会建立一个包含您要搜索的ID的表变量或临时表...然后使用Remus的解决方案,减去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];

3

与问这个问题相比,我现在要聪明一些(并且拥有一个更新的SQL Server),因此为了庆祝我问这个问题而获得的“著名问题”徽章,这就是我现在要做的事情。(我认为EXCEPT从那以后我再也没有使用过该运算符。)

我要说的是,LEFT JOIN下面的方法比EXCEPT不需要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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.