ORACLE 树遍历

2025年2月26日 | 4 分钟阅读

在本文中,我们将详细了解 Oracle 树遍历的概念。

引言

Oracle 提供了一个非常有用的功能,称为树遍历,它允许您递归地连接一个表以检索层次结构中的所有记录。 这种分层树是

  • 在公司部门中遇到的
  • 公司管理,
  • 人类家庭的家谱
  • 牲畜
  • 制造业
  • 科学研究等。

要实现 Oracle 树,我们需要使用 CONNECT BY 子句。 这提供了一种报告这些树中所有家庭成员的方法。 它允许您排除家谱的分支或单个成员,并允许您上下遍历树,在遍历过程中遇到家庭成员。

考虑一个 emp_details 表的示例

现在插入数据。

要检索数据,请使用以下查询。

输出

ID姓名JOBMGR
10Satish总统60
20NanishAnalyst30
30Nansh管理者40
40SashSalesman50
50anishAnalyst60
60anshClerk20

考虑一个例子

输出

ORACLE Tree Walking

说明

执行上述查询会得到如上所示的结果。 要创建如上所示的系列,请按照以下步骤操作

1. Oracle 使用 SELECT 语句的 START WITH 分层子句选择层次结构的根行。 这向 Oracle 指示层次结构应从哪一行开始,并声明如下

这里的条件是 (ID = 10)

START WITH 子句也可以有一个子查询。 如果在子查询中使用 WHERE 子句,则语句从满足 WHERE 条件的所有行开始。 但这不是首选,因为它没有指示真正的层次结构。 应该始终使用 START WITH 子句,但如果省略它,则树语句将从表的所有行作为根行开始。

2. 每个子行都需要满足 CONNECT BY 子句相对于根行之一的条件。 此子句解释了行之间的父/子关系,有助于确定查询的方向,无论是子到父还是父到子。 您可以使用关键字 PRIOR 将当前行与备用行区分开来,其中 PRIOR 指的是父行。 Oracle 服务器评估父行的 PRIOR 表达式和表中每一行的其他语句,以找到父行的子行。 条件为真的行是父行的子行。 有时这有助于获取不同的行,而无需在 FROM 子句中指定表。

在上面的查询中,CONNECT BY MGR = PRIOR ID 告诉 Oracle 查找下一行,其中 EMPNO 列中的值等于 PRIOR 行中 MGR 列中的值。

3. LEVEL 伪列在 Oracle 中运行的每个查询中都可用,并允许您显示行在层次结构中的等级。 它是一个数值,指示您在树中的哪个“级别”。 在此级别中,1 作为根行返回,级别 2 作为根的子行返回。

4. LPAD 函数用于使用 LEVEL 伪列将结果显示为缩进的树。 它的语法是

这将返回“char1”,因为它在左侧填充了 char2 中的字符序列,直到长度“n”。 由于我们从 ID = 10 开始,因此 ID = 10 的员工将充当根节点(级别 = 1)。

由于根位于级别 1,因此沿根节点的空空格数为 0(即 2 * (1-1))。 类似地,如果我们向下移动树,级别会一直增加 1,即 2、3、4 等,并且还有空空格。

如果要从子节点移动到父节点,请使用以下查询。

您也可以在 SELECT 语句中使用 WHERE 子句,该子句单独评估每一行的条件,而不是删除不满足条件的所有行的子行。 由于不可能使用基本 SQL 创建员工的分层列表,因为您需要一次查看表的多行,因此 CONNECT BY 子句为分层信息提供了一个很棒的功能,因此它是一个真正的省时工具。 您可以尝试另一个查询。


下一个主题What-is-asm-in-oracle