对于给定的主键列表(具有一个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
答案 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值。
假设id
和tbl1
的{{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)