学习SQL,并有一些问题。我有2张桌子level,level_hierarchy
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 |
现在,我需要的是一个查询,该查询将level基于标记要从哪个层次层次结构级别获取参数的参数,从每个层次结构级别返回表中的所有条目。
获取Level1条目非常容易。
Level1
SELECT name FROM level INNER JOIN level_hierarchy ON level.id = level_hierarchy.child_id WHERE level_hierarchy.parent_id=NULL
Level2 条目:
Level2
Level2_a Level2_b
只是有父母的父母,而父母的父母是父母的父母NULL,依此类推。这是我怀疑递归出现的地方。
NULL
有谁可以指导思想的吗?
您对第一级的查询(此处depth与表格区别)应如下所示:
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)
请注意的正确用法is null(不要总是=与进行比较)。null``null
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)