mof*_*oda 5 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
Run Code Online (Sandbox Code Playgroud)
我想查询返回一个地址,从所有祖先名称连接.我需要结果表是这样的:
Id | Address
1 | London
2 | London, Hallam Street
3 | London, Hallam Street, Bld 26
4 | London, Hallam Street, Bld 26, Office 5
Run Code Online (Sandbox Code Playgroud)
我想我必须使用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;
Run Code Online (Sandbox Code Playgroud)
我之前没有使用过PostgreSQL,所以你可能不得不对语法有点兴奋,但我认为这对于RDBMS非常准确.
| 归档时间: |
|
| 查看次数: |
4059 次 |
| 最近记录: |