如何在postgresql中用递归查询连接字段值?
我在PostgreSQL数据库中有一个表,它以树的形式包含部分地址,如下所示:如何在postgresql中用递归查询连接字段值?,sql,postgresql,recursion,concatenation,recursive-query,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 |
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
我想做一个查询,返回一个地址,从所有祖先的名字连接起来。我需要这样的结果表:
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
我想我必须使用递归查询,但我发现的所有示例都使用where子句,因此我必须将where name='Office 5'放在特定行的结果中。但是我需要为初始表的每一行连接一个地址。如何做到这一点?递归查询的诀窍是需要指定种子查询。这是一个确定根节点的查询,或者确定正在构建的树的下降或上升起点 WHERE子句存在的原因是为了建立seed ID=1或Name=Bld 26。如果您希望根据unioned select中指定的内容来提升或降低每个记录的树,那么您应该放弃WHERE语句,以便所有记录都被播种 虽然,你举的例子。。。您可能希望从种子中ID=1的位置开始,写出子ID和父ID。然后在联合中选择将派生递归表与要从中选择的表联接,并将派生递归表的子表联接到表的父表 比如:
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中,双引号不是双引号,双引号用于标识谢谢,@a_horse_和_no_name!我觉得种子周围的妄想症很奇怪。我在网上找到了一个postgresql样本,我想也许它会在意。我使用Teradata,它的语法看起来几乎相同,只是如果每个字段没有在WITH RECURSIVE子句中显式声明,它会引发一个错误。似乎一个常见的误解是union或union all查询需要括号,所以我并不奇怪您会在某个地方在线发现。我不知道这是从哪里来的,老实说,这个例子的种子用双括号括起来。虽然我从未使用过PostgreSQL,但我拒绝相信它要求在任何东西周围加上双括号。我听过太多关于它的好消息了。