sql - 如何从不在表中的列表中获取 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 解决方案的奖励积分!)
解决方案
为了将列表相互比较,输入列表需要进入数据库,或者现有 id 的列表需要从数据库中出来。后者您已经尝试过但不喜欢,所以这里有一个替代方案
SELECT "id" FROM unnest('{1,2,3,4,5}'::integer[]) AS "id" WHERE "id" NOT IN (SELECT "id" FROM "widgets");
不确定性能。
推荐阅读
- inno-setup - 包括使用 Inno Setup 6.1.1 beta to Ready 页面下载的文件摘要?
- java - 简单的弹簧启动应用程序不起作用
- google-cloud-platform - GKE 节点的互联网连接
- laravel - ErrorException (E_NOTICE) 未定义索引:名称 laravel 7
- c# - 带有 Automapper 的 EF Core 抛出异常“无法跟踪实体类型”
- c++ - 无法使用 jsoncpp 库从文件中解析 Json
- pine-script - Tradingview Pinescript 如何使用 Session 获取开盘蜡烛的交易量
- javascript - 即使启用了水平滚动条,内容也会在某个点被剪辑
- notepad++ - Notepad ++试图在每行的第5个空格之后添加一个新行
- python - Python3:线程和画布问题