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

时间:2014-10-09 13:58:07

标签: sql postgresql recursion concatenation recursive-query

我在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, Hallam Street, Bld 26, Office 5

我想我必须使用WITH RECURSIVE查询,但我发现的所有示例都使用where子句,因此我必须将WHERE name='Office 5'仅用于获取该特定行的结果。但是我的初始表的每一行都需要一个连接的地址。怎么办呢?

1 个答案:

答案 0 :(得分:5)

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

WHERE子句的原因是建立种子ID=1Name=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非常准确。