获取表中不存在的 ID 列表
Posted
技术标签:
【中文标题】获取表中不存在的 ID 列表【英文标题】:Get list of IDs not present in table 【发布时间】:2013-04-03 17:25:54 【问题描述】:假设我有一个 id 列表,例如(1, 3, 9, 2, 4, 86) 和一个带有列 id 的表。我想查找列表中没有匹配行的所有数字。
即如果mysql表是这样的:
id letter
1 a
2 b
3 c
4 d
5 e
6 f
7 g
我有列表(1, 3, 9, 2, 4, 86)
,我想要一个返回(9, 86)
的查询。
我唯一能想到的,就是建一个很大的虚拟表,比如:
select 1 as n union select 3 as n union select 9 as n union ....
然后我可以加入反对。有没有更好的办法?我希望能够在 mysql 中完成这一切。作为旁注(虽然我不认为它是相关的),我的表有大约 10,000 行,而我正在使用的列表中有大约 100 个数字。
【问题讨论】:
【参考方案1】:你必须首先create
一个包含LIST元素的表格
即(1, 3, 9, 2, 4, 86)
create table t
(
num int
)
insert into t
values
(1),(3),(9),(2),(4),(86)
现在你可以使用NOT IN
SELECT num
FROM t
WHERE num not in (select id from letter_table);
SQL Fiddle
来自评论。
编辑:
有一种方法您不必必须create
一张桌子
select N from
(select 1 as N
union all
select 3 as N
union all
select 9 as N
union all
select 2 as N
union all
select 4 as N
union all
select 86 as N)t1
where t1.N
not in (select id from letter_table)
请参考New SQL Fiddle。
我认为 OP 想要的是 Edited 部分。
附注确保您的数据库中不存在表 t1
【讨论】:
不,我想避免使用一堆联合,因为我认为它们会很慢,并且需要对列表进行预处理;不确定最有效的解决方案是什么 在那种情况下创建一个临时表是最高效的 只需使用您的实际数据测试联合与临时表,而不是推测。这两个查询大部分都可以使用一些文本编辑器 voodoo 生成。【参考方案2】:创建一个包含 ID 的表,并且您可以轻松地做到这一点。在此处查看演示
SELECT
S.id,
'' AS `letter`
FROM sequence S
WHERE S.id NOT IN(SELECT
id
FROM mytable)
SQL Fiddle Demo
【讨论】:
好的,但是你必须事先创建表。我不想要一个永久表,那么,如何从列表中构建临时表作为查询的一部分?【参考方案3】:假设您在@Luv 的回答中使用临时表或UNION
方法,请考虑将NOT IN
替换为外连接,因为它可能会执行得更好(当然,使用您的实际环境和数据进行测试):
SELECT num
FROM t
LEFT OUTER JOIN letter_table
ON t.num = letter_table.id
WHERE letter_table.id IS NULL;
如果您使用 UNION 方法,请将 FROM t
替换为 FROM ([big UNION here]) t
。
【讨论】:
以上是关于获取表中不存在的 ID 列表的主要内容,如果未能解决你的问题,请参考以下文章