首页 > 解决方案 > 如何从不在表中的列表中获取 id?

问题描述

我收到一份 ID 列表。其中大部分已经存在于表中。我需要找出哪些 ID 不在表中。这个问题与连接无关。

我的 API 会收到一个 ID 列表,例如:[1, 2, 3, 4, 5]

假设表中有 3 条记录:[2, 3, 4]

我正在寻找的结果是数组: [1, 5]

我们的 SQL 大脑很快就会跳到类似下面的内容,但显然这不是我们需要的:

select * from widgets where id not in [list]

我们不需要不在列表中的记录,我们需要不在记录中的列表部分!

我的后备是检索列表中的所有记录并从列表中减去,如下所示:

existing_ids = Widget.where(id: id_list).pluck(:id)
new_ids = id_list - existing_ids

这会奏效......但感觉很重。特别是如果 id_list 有 100,000 条记录,而表中有 99,999 条记录。

我四处搜索,唯一类似的结果是列表中的 ID 不在表格中......它没有找到可行的解决方案。

有没有办法在单个 SQL 查询中做到这一点?(ActiveRecord 解决方案的奖励积分!)

标签: sqlruby-on-railsactiverecord

解决方案


为了将列表相互比较,输入列表需要进入数据库,或者现有 id 的列表需要从数据库中出来。后者您已经尝试过但不喜欢,所以这里有一个替代方案

SELECT "id" FROM unnest('{1,2,3,4,5}'::integer[]) AS "id" WHERE "id" NOT IN (SELECT "id" FROM "widgets");

不确定性能。


推荐阅读