对于给定的主键列表(使用单个 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 值。
假设 tbl1
和 tbl2
的 id
列是 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/