平时在处理树形结构的关系的时候,是一个很复杂的事情,我们可能通过程序代码去一层一层的遍历父节点或者子节点,这样做的缺点很明显,效率不高而且操作复杂度比较大。而当我们在使用Oracle数据库的时候,我们可以有一种简单解决方法,如下:
1.首先创建一张表,保存父子关系
drop table tmp_node;
create table tmp_node(id varchar2(500),p_id varchar2(500));
2.向表中插入数据
insert into tmp_node(p_id,id) values(null,1);
insert into tmp_node(p_id,id) values(1,'1-1');
insert into tmp_node(p_id,id) values(1,'1-2');
insert into tmp_node(p_id,id) values('1-1','1-1-1');
insert into tmp_node(p_id,id) values('1-1','1-1-2');
insert into tmp_node(p_id,id) values('1-2','1-2-1');
3.查看表中数据
select * from tmp_node;
编号 |
P_ID |
ID |
1 |
|
1 |
2 |
1 |
1-1 |
3 |
1 |
1-2 |
4 |
1-1 |
1-1-1 |
5 |
1-1 |
1-1-2 |
6 |
1-2 |
1-2-1 |
4.创建视图(这一步最重要)
create or replace view tmp_node_view as
select distinct level lvl,connect_by_root(id) leaf_id,t.*
from tmp_node t
connect by prior t.p_id = t.id;
5.查看视图数据
select * form tmp_node_view order by leaf_id,lvl;
编号 |
LVL |
LEAF_ID |
ID |
P_ID |
1 |
1 |
1 |
1 |
|
2 |
1 |
1-1 |
1-1 |
1 |
3 |
2 |
1-1 |
1 |
|
4 |
1 |
1-1-1 |
1-1-1 |
1-1 |
5 |
2 |
1-1-1 |
1-1 |
1 |
6 |
3 |
1-1-1 |
1 |
|
7 |
1 |
1-1-2 |
1-1-2 |
1-1 |
8 |
2 |
1-1-2 |
1-1 |
1 |
9 |
3 |
1-1-2 |
1 |
|
10 |
1 |
1-2 |
1-2 |
1 |
11 |
2 |
1-2 |
1 |
|
12 |
1 |
1-2-1 |
1-2-1 |
1-2 |
13 |
2 |
1-2-1 |
1-2 |
1 |
14 |
3 |
1-2-1 |
1 |
|
6.使用说明
主要使用的leaf_id和id两个字段的值。
字段说明:lvl字段代表节点的深度,leaf_id代表叶节点。p_id父节点id,id节点本生id。
当需要知道一个节点有哪些父节点的时候,只需要根据leaf_id,查询id字段即可:
select * from tmp_node_view where leaf_id = '1-2-1';
编号 |
LVL |
LEAF_ID |
ID |
P_ID |
1 |
1 |
1-2-1 |
1-2-1 |
1-2 |
2 |
3 |
1-2-1 |
1 |
|
3 |
2 |
1-2-1 |
1-2 |
1 |
当需要知道一个节点有哪些子节点的时候,只需要根据id查询leaf_id即可:
select * from tmp_node_view where id = '1-2';
编号 |
LVL |
LEAF_ID |
ID |
P_ID |
1 |
1 |
1-2 |
1-2 |
1 |
2 |
2 |
1-2-1 |
1-2 |
1 |
注意:所有的父节点和子节点的查询,都是包含自身节点的。
相关推荐
在本篇文章中,我们将探讨如何利用递归查询来查找父子兄弟节点,这对于理解和处理这类关系非常关键。 首先,递归查询在Oracle中主要依赖于`START WITH`和`CONNECT BY`子句。`START WITH`指定查询的起始节点,而`...
- `CONNECT BY`:定义了父子节点之间的关系。`PRIOR`关键字用来引用当前行的上一行,即父节点。例如,`CONNECT BY PRIOR dept_id = par_dept_id`表示当前行的父节点的`dept_id`等于上一行的`par_dept_id`。 - `WHERE...
【BIEE父子维度设计】是指在Oracle Business Intelligence Enterprise Edition (BIEE) 11.6版本中,如何构建并管理具有父子关系的多级层次结构的维度。这种设计通常用于表示组织结构、地理位置或其他有层级关系的...
- **父子结点树形结构**: 在现实世界的应用中,很多数据是以父子结点的形式来表示层级关系的,例如目录结构、组织架构等。这类数据在关系数据库中通常采用表结构存储,其中每个记录(结点)会包含自身的信息以及指向...
在实际应用中,为了优化树查询性能,可以考虑创建索引,尤其是对`sjflid`字段,因为它是连接父子节点的关键。同时,避免`NULL`值,用特定的默认值(如0)替换,可以提高查询效率,因为`NULL`值可能导致全表扫描。 ...
Oracle 中的树结构查询基于 CONNECT BY 语句,该语句可以根据父子关系将数据连入树型结构中。 CONNECT BY 语句的基本格式如下: SELECT 。。。CONNECT BY {PRIOR 列名 1=列名 2|列名 1=PRIOR 列名 2}[START WITH]...
`CONNECT BY`是Oracle提供的一种特殊查询方法,用于处理层次结构的数据。它基于一个称为“连接路径”的概念,允许用户按照某种层次关系对表进行递归查询。主要用到的关键字有: - **PRIOR**:用于指定父行和子行...
`CONNECT BY`定义了父节点和子节点之间的关联规则,通常与父子节点的关联字段一起使用。`WHERE`从句则用于进一步筛选返回的行,限制结果集的特定条件。 在执行层次查询时,Oracle遵循以下步骤: 1. 选取满足`START ...
每个节点可以代表一个记录或对象,节点之间存在父子关系,用户可以通过展开和折叠节点来查看不同的层级。 1. 创建Tree Item: 在Oracle Forms Builder中,通过菜单选择“Components” -> “Tree”,然后在工作区中...
1 单条记录的定位,增加,修改,删除,维护单条记录需要考虑父子关系(难度2),叶子节点才能删除(难度1),需要考虑循环(难度3) 2 批量导入,从页面上传指定的txt文件,批量导入到数据库中,可以认为里面的数据...
而 `CONNECT BY PRIOR ID = PID` 则定义了父子节点的关系,即每个节点的 `ID` 值与其父节点的 `PID` 值相匹配。 同样的,如果我们要从 `ID = 5` 开始构建层级结构,则可以使用类似的SQL语句: ```sql SELECT * ...
总之,SQL递归函数是处理层次结构数据的强大工具,通过正向递归查找子节点、反向递归查找父节点以及构建面包屑导航路径,可以灵活地处理各种树形结构的问题。掌握这些技术能够帮助我们在数据库设计和查询中更加高效...
在Oracle数据库中,将查询结果转化为树状结构是一项高级而实用的技能,尤其适用于处理具有层级关系的数据,如产品分类、组织架构等。本篇将深入解析如何利用Oracle的特定功能,实现数据的树状展示。 ### 核心概念:...
根结点是树形结构的起点,连接条件是用于连接父子节点的关系,过滤条件是用于过滤查询结果的条件。 例如,在 DEPT 表中,查询所有部门的树形结构可以使用以下语句: SELECT * FROM persons.dept START WITH deptid...
2. 在 RECURSE 过程中, Oracle 会将当前行的子节点添加到结果集中,并递归地调用 RECURSE 过程,直到所有子节点都被处理完毕。 使用 START WITH 和 CONNECT BY 子句可以实现 SQL 的层次查询,并且可以使用 SYS_...
第四,CONNECT BY子句的条件从句必须能够表达父子节点关系,通常会使用PRIOR关键字来引用父节点的字段或子节点的字段。 伪列是Oracle数据库中一个特殊的数据对象,它并非数据表中真正的字段,但其在语法处理上类似...
`START WITH`用于指定查询的起始节点,而`CONNECT BY PRIOR`则定义了节点之间的父子关系。 - **`START WITH`**:指定查询的根节点或起始节点。 - **`CONNECT BY PRIOR`**:定义了当前行的某个列值是其父行的另一个...
这可能涉及到创建适当的表结构,定义父子节点关系的字段,以及编写查询语句来获取层级数据。查询可能包括查找特定节点的所有子节点,或者遍历整个树以生成菜单。 dtree插件则是在前端展示这些数据的工具,它可能是...
- `CONNECT BY PRIOR`子句定义了父子节点之间的关系,用于指定如何从当前行移动到其父行或子行。`PRIOR`关键字用于引用上一层的数据。 在示例的`EMPLOYEES`表中,每个员工都有一个`MANAGER_ID`字段,表示其直接上级...