确定哪些值与表行不匹配

NRe*_*ngh 10 sql-server-2005 sql-server except

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

为了更好地解释,这是我现在要做的,以检查表中不存在列表“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都在表中没有出现的值上。

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

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

Rem*_*anu 15

使用EXCEPT

SELECT * FROM
  (values (1),(2),(3),(4)) as T(ID)
EXCEPT
SELECT ID 
FROM [TABLE];
Run Code Online (Sandbox Code Playgroud)

请参阅SqlFiddle


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

SELECT 'value'
UNION SELECT 'value'
Run Code Online (Sandbox Code Playgroud)

this SO answer中所述


Mic*_*son 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];
Run Code Online (Sandbox Code Playgroud)