SQL - 列表中的值,但不在表中

时间:2012-12-07 18:59:35

标签: sql sql-server-2005

如果你有一个名单,例如Ian,Stephen和数据库表如下:

Names (table name)
Ian
Stephen
Maria

您可以通过此查询找到列表中显示的名称:select * from names where names in not within('Ian','Stephen')。这将返回'Maria'。

我如何找到列表中存在的值,但不能找到数据库中的值?例如,如果我有一个列表:Ian,Maria,Kevin和一张表:

Names (table name)
Ian
Maria

我怎么能写一个查询来回凯文?我知道我可以将列表加载到一个单独的表中并左键加入它们,但是如果有更简单的方法我就会徘徊。

5 个答案:

答案 0 :(得分:1)

SQL中没有更简单的方法。执行LEFT JOINNOT IN是SQL的方法,但您需要一个表。现在,您不必创建实际的表。你可以有类似的东西:

with names as (
     select 'Ian' as name union all
     select 'Maria' as name union all
     select 'Kevin' as name
)
select *
from names n
where n.name not in (select name from t)

您也可以在Excel中执行此操作:

  1. 将值放在列中
  2. 创建in列表并运行查询
  3. 将结果放在一列
  4. 使用vlookupmatch查找差异

答案 1 :(得分:0)

select a.name from
(select "Ian" name from dual
 union
 select "Maria" from dual
 union
 select "Stephen" from dual) a
left outer join Names n using (name)
where n.name is null

答案 2 :(得分:0)

select * from mytable 
where names in ('kevin', 'maria', 'ian')

使用正确的输入更新

我想抓住上面的内容:$

请查看以下内容。然而,它是最好的查询。但无论如何我想尝试一下。

参考* SQLFIDDLE

表:

NAME
john
ian
robin
maria
fen

查询:

select x.* from (
select * from names
union all
select 'kevin'
union all 
select 'ian'
union all
select 'maria') as x
where x.name not in 
(select * from names)
;

结果:

NAME
kevin

答案 3 :(得分:0)

在TSQL中,我会将名称列表加载到表变量中,并将其连接到您的Names表以获取任一版本的搜索。由于变量表驻留在内存中,因此可以避免创建普通表或临时表以及将值写入磁盘以进行一次操作的开销。

Declare @Temp table
(
    Name varchar(32)
)

Insert Into @Temp
Select 'Ian'
Union
Select'Stephen'
Union 
Select'Kevin'


Select
    T.Name
From @Temp as T
    left join Names as N
        on T.Name = N.Name
Where N.Name IS NULL

根据我的经验,这种连接结构比“NOT IN”方法更有效。

编辑:更新了DB版本的代码块

答案 4 :(得分:0)

对OP无用,但如果您在SQL Server 2008或更高版本的环境中,则此语法也应该有效。

SELECT
    List.NAME
FROM ( VALUES
        ('Ian')
        ,('Maria')
        ,('Kevin')
    ) AS List(NAME)
    LEFT JOIN NAMES AS N
        ON List.NAME = N.NAME
WHERE N.NAME IS NULL