oracle SYS_CONNECT_BY_PATH 函数实现将从父节点到当前行内容以“path”或者层次元素列表的形式显示出来...

本文介绍了如何在Oracle数据库中创建树形结构表,并通过具体实例演示了如何使用sys_connect_by_path函数来构建树状路径。

先创建一个树形结构的表t_test

create table T_TEST
(
	ID    NUMBER,
	PID   NUMBER,
	TITLE VARCHAR2(30)
)
tablespace TEST
pctfree 10
initrans 1
maxtrans 255
storage
(
	initial 64K
	minextents 1
	maxextents unlimited
);

insert into T_TEST (ID, PID, TITLE) values (1, 0, '一一');
insert into T_TEST (ID, PID, TITLE) values (2, 0, '二二');
insert into T_TEST (ID, PID, TITLE) values (3, 1, '一三');
insert into T_TEST (ID, PID, TITLE) values (4, 1, '一四');
insert into T_TEST (ID, PID, TITLE) values (5, 3, '一三五');
insert into T_TEST (ID, PID, TITLE) values (6, 3, '一三六');
insert into T_TEST (ID, PID, TITLE) values (7, 2, '二七');
insert into T_TEST (ID, PID, TITLE) values (8, 2, '二八');
insert into T_TEST (ID, PID, TITLE) values (9, 7, '二七九');
insert into T_TEST (ID, PID, TITLE) values (10, 7, '二七十');
commit;

 
sys_connect_by_path 函数主要作用是可以把一个父节点下的所有子节点通过某个字符进行区分,然后连接在一个列中显示 
 
--子id=父id 倒树型结构
--父id=子id   正树型结构  

先看子id=父id 倒树型结构例子:

select level ,id,pid,title,sys_connect_by_path( title , '/' ) as path
from t_test
--where level=3
start with id= 1
connect by prior id = pid order by pid; 

 
显示结果:



再看父id=子id   正树型结构 例子:

select level ,id,pid,title,sys_connect_by_path( title , '/' ) as path
from t_test
--where level=3
start with pid= 3
connect by prior pid = id order by pid; 

 结果显示:

### ### `SYS_CONNECT_BY_PATH` 函数的使用方法 `SYS_CONNECT_BY_PATH` 是 Oracle 9i 引入的一个函数,专门用于树形结构查询(层次查询)和多列合并为单列的场景。该函数必须与 `CONNECT BY` 子句一起使用,用于生成从根节点到当前节点的路径信息[^1]。 其基本语法如下: ```sql SELECT SYS_CONNECT_BY_PATH(column_name, 'separator') FROM table_name START WITH condition CONNECT BY PRIOR parent_column = child_column; ``` 其中,`column_name` 是需要形成树形结构的字段,`separator` 是路径中用于分隔各级节点的字符。`START WITH` 指定树的根节点,而 `CONNECT BY PRIOR` 定义了父子节点之间的关联关系[^2]。 ### ### 使用示例 假设有一个表示组织结构的表 `EMPLOYEE`,包含字段 `EMP_ID`(员工编号)和 `MGR_ID`(上级员工编号),可以使用以下 SQL 查询所有员工的上级路径: ```sql SELECT EMP_ID, SYS_CONNECT_BY_PATH(EMP_ID, ' -> ') AS PATH FROM EMPLOYEE START WITH MGR_ID IS NULL CONNECT BY PRIOR EMP_ID = MGR_ID; ``` 此查询将返回每个员工的编号及其从最高管理者开始的路径表示。例如,如果员工 A 是员工 B 的上级,而员工 B 又是员工 C 的上级,则员工 C 的路径将显示为 "A -> B -> C"。 ### ### 注意事项 在使用 `SYS_CONNECT_BY_PATH` 函数时,需要注意以下几点: - 分隔符不能使用逗号(`,`),否则可能会导致 Oracle 报错。如果确实需要使用逗号作为分隔符,可以通过 `REPLACE` 函数进行替换。 - 该函数只能在 `SELECT` 列表中使用,不能在 `WHERE` 子句中直接使用。 - 查询结果的路径是基于 `START WITH` 指定的根节点生成的,因此需要确保 `START WITH` 条件能够正确识别根节点。 ### ### 语法说明 `SYS_CONNECT_BY_PATH` 函数的作用是从 `START WITH` 指定的根节点开始遍历树结构,并根据 `CONNECT BY` 指定的递归条件构建路径。路径中的每个节点都会按照指定的分隔符连接成一个字符串。递归过程会在没有更多子节点满足条件时结束[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值