-1

如果您有一个名称列表,例如 Ian、Stephen 和一个数据库表,如下所示:

Names (table name)
Ian
Stephen
Maria

您可以通过以下查询在列表中找到出现在表中的名称:select * from names where names not in ('Ian','Stephen')。这将返回“玛丽亚”。

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

Names (table name)
Ian
Maria

我如何编写查询以返回 Kevin?我知道我可以将列表加载到一个单独的表中并 LEFT JOIN 它们,但如果有更简单的方法,我会徘徊。

4

5 回答 5

1

SQL 中没有更简单的方法。做LEFT JOINorNOT 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查找差异
于 2012-12-07T19:08:31.883 回答
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
于 2012-12-07T19:07:17.790 回答
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
于 2012-12-07T19:07:56.800 回答
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”方法更有效。

编辑:更新了数据库版本的代码块

于 2012-12-07T19:08:24.553 回答
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
于 2012-12-10T14:46:27.360 回答