如何连接字段值与postgresql中的递归查询?

问题描述:

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

我想我必须使用WITH RECURSIVE查询,但所有的例子我发现使用WHERE子句,所以我必须把WHERE name='Office 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相当准确。

+0

“种子”查询周围的括号毫无用处(并且在我个人看来令人困惑)。此外,字符串文字需要用SQL中的单引号('','')括起来,而不是双引号(双引号用于标识符) – 2014-10-10 12:48:31

+0

谢谢,@a_horse_with_no_name!我认为种子周围的种子很奇怪。我从一个我在网上找到的postgresql示例开始工作,并认为它可能关心。我使用Teradata,看起来语法几乎完全相同,除非它在每个字段未在WITH RECURSIVE子句中明确声明的情况下都会引起混淆。 – JNevill 2014-10-10 12:53:07

+0

这似乎是一个常见的误解,一个联合(或联合所有)查询需要括号,所以我并不感到惊讶,你发现网上某处。我不知道从哪里来,尽管 – 2014-10-10 12:55:17