微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在postgresql中使用递归查询连接字段值?

我在Postgresql数据库中有一个表,它包含树形式的部分地址,如下所示:

Id | Name         | ParentId
1  | London       | 0
2  | Hallam Street| 1
3  | Bld 26       | 2
4  | Office 5     | 3

我想查询返回一个地址,从所有祖先名称连接.我需要结果表是这样的:

Id | Address
1  | London
2  | London,Hallam Street
3  | London,Hallam Street,Bld 26
4  | London,Bld 26,Office 5

我想我必须使用WITH RECURSIVE查询,但我发现的所有示例都使用where子句,因此我必须将WHERE name =’Office 5’设置为仅为该特定行获取结果.但是我的初始表的每一行都需要一个连接的地址.如何才能做到这一点?

解决方法

递归查询的技巧是您需要指定种子查询.这是确定根节点的查询,或者是您要构建的树的下降或提升的起点.

WHERE子句的原因是建立种子ID = 1或Name = Bld 26.如果您希望每条记录都有树上升或下降(取决于您在联合选择中指定的内容),那么您应该只是废弃WHERE语句所有记录都是种子.

虽然,您提供的示例…您可能希望从种子中的WHERE ID = 1开始,但要写出子ID和父ID.然后在Union’d SELECT中将您派生的递归表与您正在选择的表一起加入,并将Derived Recursive表的Child连接到表的父级.

就像是:

WITH RECURSIVE my_tree AS (
  -- Seed

  SELECT 
      ID as Child,ParentID as Parent,Name,Name as Address
  FROM <table>
  WHERE <table>.ID = 1


  UNION

  -- Recursive Term
  SELECT 
    table.id as Child,table.parent_id as Parent,table.name,t.address || ',' || table.name as Address

  FROM my_tree as t 
    INNER JOIN <table> table ON
        t.Child = table.Parent_Id  
)
SELECT Child,Address from my_tree;

我之前没有使用过Postgresql,所以你可能不得不对语法有点兴奋,但我认为这对于RDBMS非常准确.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐