ORACLE 树结构及查询

本文介绍了如何使用Oracle SQL中的Connect By子句进行递归查询,实现从根节点到叶节点及从叶节点到根节点的数据遍历。通过具体实例展示了表结构创建与测试数据插入过程,并解释了Startwith与Connect By子句的使用方法。
Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。
创建示例表:
CREATE TABLE TBL_TEST
(
ID NUMBER,
NAME VARCHAR2(100 BYTE),
PID NUMBER DEFAULT 0
);

插入测试数据:
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');

表结构:
ID NAME PID
---------- -------------------------------------------------------------------------------- ----------
1 10 0
2 11 1
3 20 0
4 12 1
5 121 2


从Root往树末梢递归
select * from TBL_TEST
start with id=1
connect by prior id = pid
ID NAME PID
---------- -------------------------------------------------------------------------------- ----------
1 10 0
2 11 1
5 121 2
4 12 1

说明:从ID = 1开始,查到下一行时,这时上一行的ID =1=这一行的PID


从末梢往树ROOT递归
select * from TBL_TEST
start with id=5
connect by prior pid = id
ID NAME PID
---------- -------------------------------------------------------------------------------- ----------
5 121 2
2 11 1
1 10 0

说明:从ID = 5开始,这时PID = 2,查到下一行时,上一行的PID=2=这行的ID。


总结:主要看prior在哪个字符上,与前面的start with 一样,则Root往树末梢递归,否则从末梢往树ROOT递归
Oracle 数据库中,查询树形结构数据主要依赖于 `CONNECT BY` 语法,这是一种专门用于处理具有父子层级关系数据的 SQL 扩展。通过 `START WITH` 和 `CONNECT BY` 子句,可以有效地遍历树形结构,并获取所需层级的数据。 ### 查询树结构的基本语法 基本语法如下: ```sql SELECT [LEVEL], column1, column2, ... FROM table_name START WITH condition CONNECT BY PRIOR child_column = parent_column; ``` - `START WITH`:指定树的根节点条件。 - `CONNECT BY PRIOR`:定义父子节点之间的关系。 - `LEVEL`:伪列,表示当前节点在树中的层级,根节点为 1,子节点为 2,依此类推。 ### 示例查询 假设有一个名为 `tree_nodes` 的表,其结构如下: ```sql CREATE TABLE tree_nodes ( id NUMBER, node_name VARCHAR2(50), parent_id NUMBER, CONSTRAINT tn_pk PRIMARY KEY (id), CONSTRAINT tn_tn_fk FOREIGN KEY (parent_id) REFERENCES tree_nodes(id) ); ``` 要查询以 `id = 1` 为根节点的整个树结构,可以使用以下 SQL 语句: ```sql SELECT id, node_name, parent_id, LEVEL FROM tree_nodes START WITH id = 1 CONNECT BY PRIOR id = parent_id; ``` 该查询将返回从根节点开始的所有子节点,并按照层级顺序排列。 ### 查询从任意节点开始的树结构 如果希望从某个非根节点开始查询其子树,只需调整 `START WITH` 条件即可。例如,查询以 `id = 5` 为根的子树: ```sql SELECT id, node_name, parent_id, LEVEL FROM tree_nodes START WITH id = 5 CONNECT BY PRIOR id = parent_id; ``` ### 查询叶子节点到根节点的路径 若需从叶子节点向上追溯到根节点,可以交换 `CONNECT BY PRIOR` 中的表达式顺序: ```sql SELECT id, node_name, parent_id, LEVEL FROM tree_nodes START WITH id = 10 CONNECT BY PRIOR parent_id = id; ``` 此查询将从 `id = 10` 的节点开始,向上查找其所有父节点,直至根节点。 ### 使用 `LEVEL` 进行格式化输出 可以结合 `LPAD` 函数对树形结构进行缩进显示,以增强可读性: ```sql SELECT LPAD('--', LEVEL * 2 - 1) || node_name AS formatted_name FROM tree_nodes START WITH id = 1 CONNECT BY PRIOR id = parent_id; ``` 上述语句将根据 `LEVEL` 的值,对每个节点名称进行缩进显示,形成清晰的树状结构。 ### 总结 Oracle 提供了强大的树结构查询功能,通过 `START WITH` 和 `CONNECT BY PRIOR` 可以灵活地遍历树形数据。合理使用 `LEVEL` 和格式化函数,可以提升查询结果的可读性和可视化效果。[^2] [^3] [^4] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值