Oracle树形结构查询

本文介绍Oracle数据库中实现层次结构查询的方法,包括使用START WITH、CONNECT BY及PRIOR关键字的细节,并通过实例展示了如何构建树形结构的数据表以及如何进行层次查询。此外,还介绍了如何利用SIBLINGS关键字对同一层级的记录进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 ORACLE提供了一种树形结构用来实现层次查询:

  START WITH :指定查询的根行。

  CONNECT BY :指定父行和子行的关系。

  PRIOR : 引用父行。

例如:创建Table

CREATE TABLE TREE_TABLE(
ID NUMBER PRIMARY KEY,
PARENT_ID NUMBER,
SORT_ID NUMBER,
NAME VARCHAR2(50)
);
插入数据
INSERT INTO TREE_TABLE (ID,PARENT_ID,SORT_ID,NAME) VALUES (1,0,1,'Root');
INSERT INTO TREE_TABLE (ID,PARENT_ID,SORT_ID,NAME) VALUES (2,1,1,'1.1');
INSERT INTO TREE_TABLE (ID,PARENT_ID,SORT_ID,NAME) VALUES (3,1,2,'1.2');
INSERT INTO TREE_TABLE (ID,PARENT_ID,SORT_ID,NAME) VALUES (4,1,3,'1.3');
INSERT INTO TREE_TABLE (ID,PARENT_ID,SORT_ID,NAME) VALUES (5,2,1,'1.1.1');
INSERT INTO TREE_TABLE (ID,PARENT_ID,SORT_ID,NAME) VALUES (6,2,2,'1.1.2');
INSERT INTO TREE_TABLE (ID,PARENT_ID,SORT_ID,NAME) VALUES (7,3,1,'1.2.1');
INSERT INTO TREE_TABLE (ID,PARENT_ID,SORT_ID,NAME) VALUES (8,3,2,'1.2.2');
INSERT INTO TREE_TABLE (ID,PARENT_ID,SORT_ID,NAME) VALUES (9,4,1,'1.3.1');
INSERT INTO TREE_TABLE (ID,PARENT_ID,SORT_ID,NAME) VALUES (10,4,2,'1.3.2');

查询语句

1)SELECT ID,NAME

FROM TREE_TABLE START WITH PARENT_ID=0
CONNECT BY PRIOR ID=PARENT_ID;

查询结果:


执行以后的sortID和NAME字段参照表中的绿色。可以发现NAME字段已经实现了树形结构,但是在子节点之间未进行排序。为了实现在同一个父亲下面各个兄弟的排序,ORACLE提供了SIBLINGS排序。

2)SELECT ID,NAME
FROM TREE_TABLE START WITH PARENT_ID=0
CONNECT BY PRIOR ID=PARENT_ID
ORDER SIBLINGS BY SORT_ID;

查询结果:执行之后结果参照表中灰色字段1.2.1和1.2.2排序了。



   Oracle SELECT语句中的START WITH和CONNECT BY子句自动阻断一个层次。缺少这项特性,就需要一个复杂的自联接来确定行之间的逻辑联系。START WITH子句指定被认为是层次起点,或“根”的一行或几行。然后CONNECT BY PRIOR子句指明哪些行彼此关联。  在Oracle 10g(两个版本)中,现在很容易实现这一点:你可以使用新的SIBLINGS关键字建立正确的顺序。其语法如下:  
ORDER SIBLINGS BY <expression> 



SQL 2008:

with exp as(
select expType1.CODE as code,
expType1.LV as Level, 
expType1.REMARK as Remark,
expType1.P_ID as P_ID
from T_BI_EXPENSE_TYPE expType1 where expType1.P_ID is null
union all
select expType1.CODE as code,
expType1.LV as Level, 
expType1.REMARK as Remark,
expType1.P_ID as P_ID 
from T_BI_EXPENSE_TYPE expType1 join T_BI_EXPENSE_TYPE expType2
  on expType1.P_ID=expType2.ID  
)select * from exp; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值