如何连接字段值与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=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相当准确。
“种子”查询周围的括号毫无用处(并且在我个人看来令人困惑)。此外,字符串文字需要用SQL中的单引号('','')括起来,而不是双引号(双引号用于标识符) – 2014-10-10 12:48:31
谢谢,@a_horse_with_no_name!我认为种子周围的种子很奇怪。我从一个我在网上找到的postgresql示例开始工作,并认为它可能关心。我使用Teradata,看起来语法几乎完全相同,除非它在每个字段未在WITH RECURSIVE子句中明确声明的情况下都会引起混淆。 – JNevill 2014-10-10 12:53:07
这似乎是一个常见的误解,一个联合(或联合所有)查询需要括号,所以我并不感到惊讶,你发现网上某处。我不知道从哪里来,尽管 – 2014-10-10 12:55:17