【发布时间】:2020-09-28 18:59:00
【问题描述】:
我收到一份 ID 列表。其中大部分已经存在于表中。我需要找出哪些 ID 不在表中。这个问题与join无关。
我的 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 from list that is not in a table ... 没有找到可行的解决方案。
有没有办法在单个 SQL 查询中做到这一点? (ActiveRecord 解决方案的奖励积分!)
【问题讨论】:
-
从逻辑上讲,您必须要么将 id 发送到 db,要么从 db 中检索所有 id 的列表。您的解决方案是前者,我也倾向于前者(除非 I'd_list 非常大)。唯一可能探索的其他途径是布隆过滤器之类的东西,但要等到更简单的解决方案出现实际问题。
标签: sql ruby-on-rails activerecord