【问题标题】:Retrieve rows from tables by primary key in order of given ID lists?按给定 ID 列表的顺序按主键从表中检索行?
【发布时间】:2019-08-06 01:54:14
【问题描述】:

对于给定的主键列表(以单个 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

【问题讨论】:

  • 如果主键查找失败对于给定的 id 而不是返回所有空值,只要它会抛出异常,这没关系。
  • 请包括实际查询每个表的示例数据。

标签: sql arrays postgresql join


【解决方案1】:

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

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;

见:

【讨论】:

    【解决方案2】:

    请试试这个

    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)
    

    【讨论】:

      猜你喜欢
      • 2011-03-16
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多