Moo*_*ego 1 sql postgresql recursive-query hierarchical-data
学习SQL,遇到一点问题。我有 2 张level桌子level_hierarchy
|name | id | |parent_id | child_id|
------------------- ---------------------
| Level1_a | 1 | | NULL | 1 |
| Level2_a | 19 | | 1 | 19 |
| Level2_b | 3 | | 1 | 3 |
| Level3_a | 4 | | 3 | 4 |
| Level3_b | 5 | | 3 | 5 |
| Level4_a | 6 | | 5 | 6 |
| Level4_b | 7 | | 5 | 7 |
Run Code Online (Sandbox Code Playgroud)
现在我需要的是一个查询,该查询将level根据标记我想要从中获取条目的级别的参数,返回每个层次结构级别的表中的所有条目。
获取Level1条目非常容易。
SELECT name FROM level INNER JOIN level_hierarchy ON level.id =
level_hierarchy.child_id WHERE level_hierarchy.parent_id=NULL
Run Code Online (Sandbox Code Playgroud)
Level2条目:
Level2_a
Level2_b
Run Code Online (Sandbox Code Playgroud)
只是那些有父母的人,而他们父母的父母是NULL等等。这就是我怀疑递归发挥作用的地方。
有没有人可以指导一下?
您对第一级的查询(此处是depth为了与表区分开)应如下所示:
select l.name, h.child_id, 1 as depth
from level l
join level_hierarchy h on l.id = h.child_id
where h.parent_id is null;
name | child_id | depth
----------+----------+-------
Level1_a | 1 | 1
(1 row)
Run Code Online (Sandbox Code Playgroud)
请注意正确使用is null(不要使用=与进行比较,null因为它总是给出null)。
您可以使用上面的内容作为递归 cte 中的初始查询:
with recursive recursive_query as (
select l.name, h.child_id, 1 as depth
from level l
join level_hierarchy h on l.id = h.child_id
where h.parent_id is null
union all
select l.name, h.child_id, depth + 1
from level l
join level_hierarchy h on l.id = h.child_id
join recursive_query r on h.parent_id = r.child_id
)
select *
from recursive_query
-- where depth = 2
name | child_id | depth
----------+----------+-------
Level1_a | 1 | 1
Level2_b | 3 | 2
Level2_a | 19 | 2
Level3_a | 4 | 3
Level3_b | 5 | 3
Level4_a | 6 | 4
Level4_b | 7 | 4
(7 rows)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1645 次 |
| 最近记录: |