您的位置:首页 > 数据库 > Oracle

树形查询新特性CONNECT_BY_ISLEAF的9i实现方式

2009-12-25 12:03 495 查看
 在10g中Oracle提供了新的伪列:CONNECT_BY_ISLEAF,通过这个伪列,可以判断当前的记录是否是树的叶节点。
这里描述一下在9i中如何实现相应的功能.
首先构造一个例子:

 
CREATE TABLE T_TREE (ID NUMBER PRIMARY KEY, FATHER_ID NUMBER, NAME VARCHAR2(30));
INSERT INTO T_TREE VALUES (1, 0, 'A');
INSERT INTO T_TREE VALUES (2, 1, 'BC');
INSERT INTO T_TREE VALUES (3, 1, 'DE');
INSERT INTO T_TREE VALUES (4, 1, 'FG');
INSERT INTO T_TREE VALUES (5, 2, 'HIJ');
INSERT INTO T_TREE VALUES (6, 4, 'KLM');
INSERT INTO T_TREE VALUES (7, 6, 'NOPQ');
COMMIT;
 
 
select * from t_tree;
 

4000
   IDFATHER_IDNAME
110A
221BC
331DE
441FG
552HIJ
664KLM
776NOPQ
 
 
看看CONNECT_BY_ISLEAF的功能:
 
SELECT ID, FATHER_ID, NAME, CONNECT_BY_ISLEAF LEAF
FROM T_TREE
START WITH FATHER_ID = 0
CONNECT BY PRIOR ID = FATHER_ID;

 

   IDFATHER_IDNAMELEAF
110A0
221BC0
352HIJ1
431DE1
541FG0
664KLM0
776NOPQ1
 
SELECT ID, FATHER_ID, NAME, CONNECT_BY_ISLEAF LEAF
FROM T_TREE
START WITH ID = 7
ONNECT BY PRIOR FATHER_ID = ID;


   IDFATHER_IDNAMELEAF
176NOPQ0
264KLM0
341FG0
410A1
 
CONNECT_BY_ISLEAF可以判断当前记录是否是树的叶节点。而这个功能在9i中没有简单的方法来实现,只能通过分析函数来进行判断:
 
SELECT
ID,
FATHER_ID,
NAME,
CASE WHEN LEAD(LEVELS) OVER(ORDER BY RN) > LEVELS THEN 0 ELSE 1 END LEAF
FROM
(
SELECT ROWNUM RN, ID, FATHER_ID, NAME, LEVEL LEVELS
FROM T_TREE
START WITH FATHER_ID = 0
CONNECT BY PRIOR ID = FATHER_ID
);

 
   IDFATHER_IDNAMELEAF
110A0
221BC0
352HIJ1
431DE1
541FG0
664KLM0
776NOPQ1
 
SELECT
ID,
FATHER_ID,
NAME,
CASE WHEN LEAD(LEVELS) OVER(ORDER BY RN) > LEVELS THEN 0 ELSE 1 END LEAF
FROM
(
SELECT ROWNUM RN, ID, FATHER_ID, NAME, LEVEL LEVELS
FROM T_TREE
START WITH ID = 7
CONNECT BY PRIOR FATHER_ID = ID
);

 
   IDFATHER_IDNAMELEAF
176NOPQ0
264KLM0
341FG0
410A1
 利用分析函数可以相对简单的在9i实现CONNECT_BY_ISLEAF伪列的功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tree insert oracle table