从静态值中查找表中不存在的项

时间:2015-07-30 01:41:05

标签: sql sql-server tsql

我有一个静态的字符串列表,我想从中确定哪些字符串在特定的表中不存在。此列表包含超过一千个条目,并且在数据库中不存在(我无法对数据库进行更改,我只能对其进行查询)

例如,我的字符串列表可能是("Apple", "Orange", "Banana"),而我要搜索的表格是:

Id   Name
1    Apple
2    Banana

查询结果应为Orange 我可以找到容易存在的那些,但不能做反过来。

3 个答案:

答案 0 :(得分:2)

如果希望列表显示在结果中,则需要构建某种类型的表:permanent,temporary或derived。例如:

with list as (
      select 'Apple' as name union all select 'Banana' union all select 'Orange'
     )
select l.*
from list l
where not exists (select 1 from table t where t.name = l.name);

在网络上,您可以轻松找到split()功能,该功能可让您编写如下查询:

with list(name) as (
      select *
      from dbo.split(@ListAsString, ',')
     )
select l.*
from list l
where not exists (select 1 from table t where t.name = l.name);

这是另一个想法。我不是真的推荐它,但它可能适用于某些情况:

select @ListAsString = replace(@ListAsString, t.name, '')
from table t;

您可能希望包含适当的分隔符。我们的想法是从字符串中删除元素。最后,您最终获得了不匹配名称的值。但它是一个字符串,而不是表格。

答案 1 :(得分:1)

DECLARE @tbl TABLE( Id INT, Name VARCHAR(20))

INSERT @tbl
    SELECT 1, 'Apple' UNION ALL
    SELECT 2, 'Banana'

使用NOT IN

SELECT Name FROM
    (SELECT 'Apple' Name UNION ALL
     SELECT 'Banana' UNION ALL
     SELECT 'Orange') t
WHERE Name NOT IN (SELECT Name FROM @tbl)

答案 2 :(得分:0)

select name from sometable 
where not exists (select 'Apple' union select 'Banana' union select 'Orange')

这是你想要做的吗?