如果你有一个名单,例如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
我怎么能写一个查询来回凯文?我知道我可以将列表加载到一个单独的表中并左键加入它们,但是如果有更简单的方法我就会徘徊。
答案 0 :(得分:1)
SQL中没有更简单的方法。执行LEFT JOIN
或NOT 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中执行此操作:
in
列表并运行查询vlookup
或match
查找差异答案 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