sql - 按给定 ID 列表的顺序按主键从表中检索行?

标签 sql arrays postgresql join

对于给定的主键列表(使用单个 id 列作为主键),我想从数据库中按顺序检索与这些 id 相关的行。如果数据库中不存在该 id,则该特定行应该全部为空。

对于数据库中的两个不同表,我有两个这样的等长列表。我想并排连接两个表(如果可能,在服务器端)。

我们有两个 id 列表:[1, 2, 3, 4][3, 2, 4, 1]
在第一个表上使用第一个列表检索的查询:

 id    c1
----  ----
 1     a
 2     b
 3     c
 4     d

在第二个表中使用第二个列表检索:

 id    c2
----  ----
 3     g
 2     h
 4     i
 1     j

最终结果应该是:

 c1    c2
----  ----
 a     g
 b     h
 c     i
 d     j

最佳答案

将列表提供为数组并并行取消嵌套:

SELECT t1.c1, t2.c2
FROM   unnest ('{1, 2, 3, 4}'::int[]
             , '{3, 2, 4, 1}'::int[]) AS i(id1, id2)
LEFT   JOIN tbl1 t1 ON t1.id = i.id1
LEFT   JOIN tbl2 t2 ON t2.id = i.id2;

使用 2x LEFT JOIN 保证每个索引都在输出中表示,即使在一个或两个表中没有找到行 - 然后你得到 NULL 值。

假设 tbl1tbl2id 列是 UNIQUE,或者这可以创建一个“交叉通过代理加入”。见:

如果您还想保留排序顺序,请添加 WITH ORDINALITY:

SELECT t1.c1, t2.c2
FROM   unnest ('{1, 2, 3, 4}'::int[]
             , '{3, 2, 4, 1}'::int[]) WITH ORDINALITY i(id1, id2, ord)
LEFT   JOIN tbl1 t1 ON t1.id = i.id1
LEFT   JOIN tbl2 t2 ON t2.id = i.id2
ORDER  BY ord;

参见:

关于sql - 按给定 ID 列表的顺序按主键从表中检索行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55174911/

相关文章:

sql - 查找日期列的最小值和最大值

sql - t-sql 中的左外连接

sql - 如何删除具有数据库所有者权限的 SQL Server 用户

mysql - 优化SQL以获取1天的数据

ruby-on-rails - 如何使用 Controller 保存数组参数?

javascript - 如何识别大型数组中的重复项?

sql - 一个简单的 postgresql 查询的算法改进

mysql - SQL 需要 'with' 命令

javascript - 如何在 Vue 中使过滤列表更具动态性

python - Django Tastypie Postgres 服务器响应缓慢