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

时间:2019-03-15 02:55:35

标签: 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

2 个答案:

答案 0 :(得分:1)

将列表提供为 arrays 并并行嵌套:

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值。

假设idtbl1的{​​{1}}列为tbl2,或者这可以创建“代理交叉连接”。参见:

如果您还想保留排序顺序,请添加UNIQUE

WITH ORDINALITY

请参阅:

答案 1 :(得分:0)

请尝试

SELECT AA.C1,BB.C2 FROM (
(SELECT ROW_NUMBER() OVER(ORDER BY a.id) As row_num, * FROM @tbl1 A ) AS AA
INNER JOIN
(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 1)) As row_num, * FROM @tbl2 A) AS BB
ON AA.row_num =BB.row_num)