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;