PostgreSQL在一行中查看同一张表的一组相关记录

格拉

让我们认为下表包含链接记录:

CREATE TABLE tbl(id integer,
                 name text,
                 next_id integer,
                 UNIQUE(id),
                 FOREIGN KEY(next_id) REFERENCES tbl(id));

将给定的数据插入其中:

INSERT INTO tbl(id,  name, next_id)
         VALUES( 1, 'x_0',       2),
               ( 2, 'x_1',       3),
               ( 3, 'x_2',    null),
               ( 4, 'y_0',       5),
               ( 5, 'y_1',       6),
               ( 6, 'y_2',       7),
               ( 7, 'y_3',    null);

我们可以自我联接该表,以获得在单行中查看的每组链接数据:

SELECT
   *
FROM
   tbl t_1 LEFT JOIN tbl t_2 ON t_1.next_id = t_2.id
           LEFT JOIN tbl t_3 ON t_2.next_id = t_3.id
           LEFT JOIN tbl t_4 ON t_3.next_id = t_4.id
WHERE t_1.id = 1 OR t_1.id = 4
ORDER BY t_1.id ASC;

现在的问题是:当链接集中的元素数和集合数是任意的时,在一般情况下如何编写一个可以实现相同目标的查询。提前谢谢了

克林

您不能编写产生未知列数的查询。查询结果的结构由该查询定义。但是,您可以将结果汇总到数组中。这可以通过如下递归查询来完成:

with recursive cte as (
    select
        id,
        next_id,
        array[id] as ids,
        array[name] as names
    from tbl t
    where not exists (
        select from tbl s
        where s.next_id = t.id)
union all
    select 
        c.id,
        t.next_id,
        ids || t.id,
        names || t.name
    from tbl t
    join cte c on c.next_id = t.id
)
select distinct on (id)
    id,
    ids,
    names
from cte
order by id, cardinality(ids) desc

 id |    ids    |       names
----+-----------+-------------------
  1 | {1,2,3}   | {x_0,x_1,x_2}
  4 | {4,5,6,7} | {y_0,y_1,y_2,y_3}
(2 rows)

Db <>提琴。

在文档中阅读有关递归查询的信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Mysql如何从同一张表的单个查询中获取2组结果?

如何使用MERGE的“不匹配时”在同一张表中插入新记录?

如何比较同一张表中的记录列?

MYSQL更新同一张表后如何更新表中的一行?

返回同一组中具有上一行值的行(Oracle Sql)

在MySQL的同一张表中找到许多匹配到一行

在同一张表上的LEFT JOIN使行加倍

在Postgresql中多次合并到同一张表的最佳方法是什么?

根据同一张表中的特定值查找最新记录

使用同一表中的另一组记录更新表中某些行的列

当在另一张表中插入一行时如何自动增加一张表中的值

在Excel的同一张表中引用上一行的单元格吗?

PostgreSQL-如何从同一张表中获取空(空)记录?

如何从同一张表的两列中获得一行中的不同结果?

多次连接同一张表

sql比较同一张表中的两个唯一行

如何在同一张表中插入只有一列与另一行不同的行?

连接同一张表的两行,这些行指向另一张表中的同一事物

在PostgreSQL中的表中插入一组行

如果一行包含另一张表中的键,则汇总金额

多次查询同一张表

在PostgreSQL的同一张表中复制行记录

根据同一张表中的两个键获取记录数组

mysql 从同一张表中获取记录

sequelize 与同一张表的关联

在同一张表中查找相似的记录

将一张工作表中列中的范围转移到另一张工作表中的一行

GSheets 将一张工作表中的一行复制到另一张工作表,其中包含同一行

sql合并同一张表中的行