获取表中不存在的 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 列表的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 返回其他数据库表中不存在的行 ID 列表

如果其他表中不存在 id,则获取不同的行并使用合并

从 SQL SELECT 语句中获取值,即使它在表中不存在

MySQL内部连接查询以获取其他表中不存在的记录

获取另一个表中不存在的所有项目

mysql获取条件中描述的所有记录,即使表中不存在