当前位置: 首页 > 面试题库 >

基于邻接表的递归查询递归数据

许展鹏
2023-03-14
问题内容

学习SQL,并有一些问题。我有2张桌子levellevel_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条目非常容易。

SELECT name FROM level INNER JOIN level_hierarchy ON level.id = 
level_hierarchy.child_id WHERE level_hierarchy.parent_id=NULL

Level2 条目:

Level2_a
Level2_b

只是有父母的父母,而父母的父母是父母的父母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)

请注意的正确用法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)


 类似资料:
  • 问题内容: 我有一组按层次结构组织的数据,应该可以增长到任意大小。我需要检索整个树,但是我无法弄清楚如何仅使用SQL来完成。我当前的解决方案是创建一个临时表,并使用递归函数依次查询树的分支,然后将结果存储在临时表中,随后我再次对其进行查询以产生所需的结果。 我的问题是,从本质上讲,我正在执行的联接正确吗?构造一个中间表,然后查询结果。似乎应该有一种使用联接的方法,但是MySQL文档仅涵盖检索有限深

  • 问题内容: JPA 2是否具有运行递归查询的任何机制? 这是我的情况:我有一个实体E,其中包含一个整数字段x。它还可能具有通过@OneToMany映射的E类型的子代。我想做的是通过主键找到一个E,并获取其x的值以及所有后代的x值。有没有办法在单个查询中执行此操作? 我正在使用Hibernate 3.5.3,但我不希望在Hibernate API上没有任何明确的依赖关系。 编辑:根据这一项目,Hib

  • 问题内容: 我有下表: 我想让所有行都回溯,直到不再有parentID为止。因此, “ .... WHERE id = 5” 会给我: 问题答案: 您正在使用邻接表模型来组织层次结构数据。这种递归操作很困难的事实实际上是该模型的一个主要缺点。 一些DBMS(例如SQL Server 2005,Postgres 8.4和Oracle 11g)支持使用带有关键字的常用表表达式进行递归查询。 对于MyS

  • 问题内容: 基于现有表,我使用了CTE递归查询来得出以下数据。但是无法进一步应用它。 数据如下 我想从上述数据递归形成完整路径。意味着递归将给出以下输出。 谢谢 问题答案: 以下是CTE的示例:

  • 问题内容: 我对PLSQL的更高级主题还是陌生的,因此希望有人可以帮助我。 问题: 我有一个表,其中包含管理员和用户之间发送的消息。该表在同一表的message_id字段中具有带FK的message_parent:如果填充了该字段,则意味着该消息是作为对先前消息的答复而发送的。我需要选择属于同一对话的所有消息并显示它们。可以通过单个查询完成此操作,还是需要一个过程来处理这种逻辑?据我了解,它必须是

  • 表T表示树。每个记录都是一个节点,每个节点只有一个父节点。 该查询计算每个节点的每个分支的SUM()。 我一直在尝试使用替代的子查询分解语法来实现这个查询的相同结果。任何帮助都将不胜感激!