oracle 层次查询判断叶子和根节点
2011-08-26 11:18
260 查看
oracle 9i判断是叶子或根节点,是比较麻烦的一件事情,SQL演示脚本如下:
view plaincopy to clipboardprint?
DROP TABLE idb_hierarchical;
create TABLE idb_hierarchical
(
id number,
parent_id number,
str varchar2(10)
);
insert into idb_hierarchical values(1,null,'A');
insert into idb_hierarchical values(2,1,'B');
insert into idb_hierarchical values(3,2,'C');
insert into idb_hierarchical values(4,3,'D');
insert into idb_hierarchical values(5,2,'E');
insert into idb_hierarchical values(6,2,'F');
insert into idb_hierarchical values(7,3,'G');
insert into idb_hierarchical values(8,4,'H');
insert into idb_hierarchical values(9,4,'I');
insert into idb_hierarchical values(10,null,'J');
insert into idb_hierarchical values(11,10,'K');
insert into idb_hierarchical values(12,11,'L');
insert into idb_hierarchical values(13,10,'M');
示例数据清单如下:
view plaincopy to clipboardprint?
SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
FROM idb_hierarchical
START WITH PARENT_ID IS NULL
CONNECT BY PARENT_ID = PRIOR ID;
表1:数据清单
在表1中,ID为8、9、 7、5、6、12、13都没有子节点,因此称为叶节点。
view plaincopy to clipboardprint?
SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
FROM idb_hierarchical I
--在oracle 9i中显示叶节点,需要判断是否有子节点即可
WHERE NOT EXISTS(SELECT 1
FROM idb_hierarchical B
WHERE I.ID=B.PARENT_ID)
START WITH PARENT_ID IS NULL
CONNECT BY PARENT_ID = PRIOR ID;
表2
显示所有节点,标明该行是否为叶节点SQL
view plaincopy to clipboardprint?
SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL,
NVL((SELECT 'N'
FROM idb_hierarchical B
WHERE I.ID=B.PARENT_ID
AND ROWNUM < 2),'Y') IS_LEAF
FROM idb_hierarchical I
START WITH PARENT_ID IS NULL
CONNECT BY PARENT_ID = PRIOR ID;
表3
SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
FROM idb_hierarchical I
START WITH id =2
CONNECT BY PARENT_ID = PRIOR ID;
表4
根节点ID应该为3、5、6,即lvl为1即可
查询根节点,只显示根节点SQL
view plaincopy to clipboardprint?
SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
ID,
PARENT_ID,
LEVEL LVL,
(select b.str
from idb_hierarchical b
where level = 1
start with b.id = 2
connect by prior b.id = b.parent_id
) root_str
FROM idb_hierarchical I
where level = 1
START WITH id = 2
CONNECT BY PARENT_ID = PRIOR ID;
表5
标明根节点SQL
view plaincopy to clipboardprint?
SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
ID,
PARENT_ID,
DECODE(LEVEL, 1, 'Y', 'N') is_root,
LEVEL LVL,
(select b.str
from idb_hierarchical b
where level = 1
start with b.id = 2
connect by prior b.id = b.parent_id) root_str
FROM idb_hierarchical I
START WITH id = 2
CONNECT BY PARENT_ID = PRIOR ID;
表6
在oracle 10g提供了connect_by_isleaf和connect_by_root
SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
FROM idb_hierarchical I
where connect_by_isleaf=1
START WITH PARENT_ID IS NULL
CONNECT BY PARENT_ID = PRIOR ID;
表7
view plaincopy to clipboardprint?
SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL,
decode(connect_by_isleaf,1,'Y','N') IS_LEAF
FROM idb_hierarchical I
START WITH PARENT_ID IS NULL
CONNECT BY PARENT_ID = PRIOR ID;
表8
SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
ID,
PARENT_ID,
LEVEL LVL,
connect_by_root STR ROOT_STR
FROM idb_hierarchical I
START WITH id = 2
CONNECT BY PARENT_ID = PRIOR ID;
表9
view plaincopy to clipboardprint?
SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
ID,
PARENT_ID,
DECODE(LEVEL, 1, 'Y', 'N') is_root,
LEVEL LVL,
connect_by_root STR ROOT_STR
FROM idb_hierarchical I
START WITH id = 3
CONNECT BY PARENT_ID = PRIOR ID;
表10
view plaincopy to clipboardprint?
SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
ID,
PARENT_ID,
DECODE(LEVEL, 1, 'Y', 'N') is_root,
LEVEL LVL,
connect_by_root STR ROOT_STR
FROM idb_hierarchical I
START WITH PARENT_ID = 2
CONNECT BY PARENT_ID = PRIOR ID;
表11
view plaincopy to clipboardprint?
DROP TABLE idb_hierarchical;
create TABLE idb_hierarchical
(
id number,
parent_id number,
str varchar2(10)
);
insert into idb_hierarchical values(1,null,'A');
insert into idb_hierarchical values(2,1,'B');
insert into idb_hierarchical values(3,2,'C');
insert into idb_hierarchical values(4,3,'D');
insert into idb_hierarchical values(5,2,'E');
insert into idb_hierarchical values(6,2,'F');
insert into idb_hierarchical values(7,3,'G');
insert into idb_hierarchical values(8,4,'H');
insert into idb_hierarchical values(9,4,'I');
insert into idb_hierarchical values(10,null,'J');
insert into idb_hierarchical values(11,10,'K');
insert into idb_hierarchical values(12,11,'L');
insert into idb_hierarchical values(13,10,'M');
DROP TABLE idb_hierarchical; create TABLE idb_hierarchical ( id number, parent_id number, str varchar2(10) ); insert into idb_hierarchical values(1,null,'A'); insert into idb_hierarchical values(2,1,'B'); insert into idb_hierarchical values(3,2,'C'); insert into idb_hierarchical values(4,3,'D'); insert into idb_hierarchical values(5,2,'E'); insert into idb_hierarchical values(6,2,'F'); insert into idb_hierarchical values(7,3,'G'); insert into idb_hierarchical values(8,4,'H'); insert into idb_hierarchical values(9,4,'I'); insert into idb_hierarchical values(10,null,'J'); insert into idb_hierarchical values(11,10,'K'); insert into idb_hierarchical values(12,11,'L'); insert into idb_hierarchical values(13,10,'M');
示例数据清单如下:
view plaincopy to clipboardprint?
SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
FROM idb_hierarchical
START WITH PARENT_ID IS NULL
CONNECT BY PARENT_ID = PRIOR ID;
SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL FROM idb_hierarchical START WITH PARENT_ID IS NULL CONNECT BY PARENT_ID = PRIOR ID;
STR_LEVEL | ID | PARENT_ID | LVL |
---|---|---|---|
+..A | 1 | 1 | |
+….B | 2 | 1 | 2 |
+……C | 3 | 2 | 3 |
+……..D | 4 | 3 | 4 |
+……….H | 8 | 4 | 5 |
+……….I | 9 | 4 | 5 |
+……..G | 7 | 3 | 4 |
+……E | 5 | 2 | 3 |
+……F | 6 | 2 | 3 |
+..J | 10 | 1 | |
+….K | 11 | 10 | 2 |
+……L | 12 | 11 | 3 |
+….M | 13 | 10 | 2 |
1.oracle9i 查询叶节点
只显示叶子节点SQLview plaincopy to clipboardprint?
SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
FROM idb_hierarchical I
--在oracle 9i中显示叶节点,需要判断是否有子节点即可
WHERE NOT EXISTS(SELECT 1
FROM idb_hierarchical B
WHERE I.ID=B.PARENT_ID)
START WITH PARENT_ID IS NULL
CONNECT BY PARENT_ID = PRIOR ID;
SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL FROM idb_hierarchical I --在oracle 9i中显示叶节点,需要判断是否有子节点即可 WHERE NOT EXISTS(SELECT 1 FROM idb_hierarchical B WHERE I.ID=B.PARENT_ID) START WITH PARENT_ID IS NULL CONNECT BY PARENT_ID = PRIOR ID;
STR_LEVEL | ID | PARENT_ID | LVL |
+……….H | 8 | 4 | 5 |
+……….I | 9 | 4 | 5 |
+……..G | 7 | 3 | 4 |
+……E | 5 | 2 | 3 |
+……F | 6 | 2 | 3 |
+……L | 12 | 11 | 3 |
+….M | 13 | 10 | 2 |
view plaincopy to clipboardprint?
SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL,
NVL((SELECT 'N'
FROM idb_hierarchical B
WHERE I.ID=B.PARENT_ID
AND ROWNUM < 2),'Y') IS_LEAF
FROM idb_hierarchical I
START WITH PARENT_ID IS NULL
CONNECT BY PARENT_ID = PRIOR ID;
SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL, NVL((SELECT 'N' FROM idb_hierarchical B WHERE I.ID=B.PARENT_ID AND ROWNUM < 2),'Y') IS_LEAF FROM idb_hierarchical I START WITH PARENT_ID IS NULL CONNECT BY PARENT_ID = PRIOR ID;
STR_LEVEL | ID | PARENT_ID | LVL | IS_LEAF |
+..A | 1 | 1 | N | |
+....B | 2 | 1 | 2 | N |
+......C | 3 | 2 | 3 | N |
+........D | 4 | 3 | 4 | N |
+..........H | 8 | 4 | 5 | Y |
+..........I | 9 | 4 | 5 | Y |
+........G | 7 | 3 | 4 | Y |
+......E | 5 | 2 | 3 | Y |
+......F | 6 | 2 | 3 | Y |
+..J | 10 | 1 | N | |
+....K | 11 | 10 | 2 | N |
+......L | 12 | 11 | 3 | Y |
+....M | 13 | 10 | 2 | Y |
oracle 9i 查询根节点
view plaincopy to clipboardprint?SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
FROM idb_hierarchical I
START WITH id =2
CONNECT BY PARENT_ID = PRIOR ID;
SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL FROM idb_hierarchical I START WITH id =2 CONNECT BY PARENT_ID = PRIOR ID;
STR_LEVEL | ID | PARENT_ID | LVL |
+..B | 2 | 1 | 1 |
+....C | 3 | 2 | 2 |
+......D | 4 | 3 | 3 |
+........H | 8 | 4 | 4 |
+........I | 9 | 4 | 4 |
+......G | 7 | 3 | 3 |
+....E | 5 | 2 | 2 |
+....F | 6 | 2 | 2 |
查询根节点,只显示根节点SQL
view plaincopy to clipboardprint?
SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
ID,
PARENT_ID,
LEVEL LVL,
(select b.str
from idb_hierarchical b
where level = 1
start with b.id = 2
connect by prior b.id = b.parent_id
) root_str
FROM idb_hierarchical I
where level = 1
START WITH id = 2
CONNECT BY PARENT_ID = PRIOR ID;
SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL, ID, PARENT_ID, LEVEL LVL, (select b.str from idb_hierarchical b where level = 1 start with b.id = 2 connect by prior b.id = b.parent_id ) root_str FROM idb_hierarchical I where level = 1 START WITH id = 2 CONNECT BY PARENT_ID = PRIOR ID;
STR_LEVEL | ID | PARENT_ID | LVL | ROOT_STR |
+..B | 2 | 1 | 1 | B |
view plaincopy to clipboardprint?
SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
ID,
PARENT_ID,
DECODE(LEVEL, 1, 'Y', 'N') is_root,
LEVEL LVL,
(select b.str
from idb_hierarchical b
where level = 1
start with b.id = 2
connect by prior b.id = b.parent_id) root_str
FROM idb_hierarchical I
START WITH id = 2
CONNECT BY PARENT_ID = PRIOR ID;
SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL, ID, PARENT_ID, DECODE(LEVEL, 1, 'Y', 'N') is_root, LEVEL LVL, (select b.str from idb_hierarchical b where level = 1 start with b.id = 2 connect by prior b.id = b.parent_id) root_str FROM idb_hierarchical I START WITH id = 2 CONNECT BY PARENT_ID = PRIOR ID;
STR_LEVEL | ID | PARENT_ID | IS_ROOT | LVL | ROOT_STR |
+..B | 2 | 1 | Y | 1 | B |
+....C | 3 | 2 | N | 2 | B |
+......D | 4 | 3 | N | 3 | B |
+........H | 8 | 4 | N | 4 | B |
+........I | 9 | 4 | N | 4 | B |
+......G | 7 | 3 | N | 3 | B |
+....E | 5 | 2 | N | 2 | B |
+....F | 6 | 2 | N | 2 | B |
oracle 10g用connect_by_isleaf判断叶节点
view plaincopy to clipboardprint?SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL
FROM idb_hierarchical I
where connect_by_isleaf=1
START WITH PARENT_ID IS NULL
CONNECT BY PARENT_ID = PRIOR ID;
SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL FROM idb_hierarchical I where connect_by_isleaf=1 START WITH PARENT_ID IS NULL CONNECT BY PARENT_ID = PRIOR ID;
STR_LEVEL | ID | PARENT_ID | LVL |
+..........H | 8 | 4 | 5 |
+..........I | 9 | 4 | 5 |
+........G | 7 | 3 | 4 |
+......E | 5 | 2 | 3 |
+......F | 6 | 2 | 3 |
+......L | 12 | 11 | 3 |
+....M | 13 | 10 | 2 |
SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL,
decode(connect_by_isleaf,1,'Y','N') IS_LEAF
FROM idb_hierarchical I
START WITH PARENT_ID IS NULL
CONNECT BY PARENT_ID = PRIOR ID;
SELECT RPAD('+',LEVEL*2+1,'.')||STR STR_LEVEL,ID,PARENT_ID,LEVEL LVL, decode(connect_by_isleaf,1,'Y','N') IS_LEAF FROM idb_hierarchical I START WITH PARENT_ID IS NULL CONNECT BY PARENT_ID = PRIOR ID;
STR_LEVEL | ID | PARENT_ID | LVL | IS_LEAF |
+..A | 1 | 1 | N | |
+....B | 2 | 1 | 2 | N |
+......C | 3 | 2 | 3 | N |
+........D | 4 | 3 | 4 | N |
+..........H | 8 | 4 | 5 | Y |
+..........I | 9 | 4 | 5 | Y |
+........G | 7 | 3 | 4 | Y |
+......E | 5 | 2 | 3 | Y |
+......F | 6 | 2 | 3 | Y |
+..J | 10 | 1 | N | |
+....K | 11 | 10 | 2 | N |
+......L | 12 | 11 | 3 | Y |
+....M | 13 | 10 | 2 | Y |
oracle 10g用connect_by_root判断根节点
view plaincopy to clipboardprint?SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
ID,
PARENT_ID,
LEVEL LVL,
connect_by_root STR ROOT_STR
FROM idb_hierarchical I
START WITH id = 2
CONNECT BY PARENT_ID = PRIOR ID;
SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL, ID, PARENT_ID, LEVEL LVL, connect_by_root STR ROOT_STR FROM idb_hierarchical I START WITH id = 2 CONNECT BY PARENT_ID = PRIOR ID;
STR_LEVEL | ID | PARENT_ID | LVL | ROOT_STR |
---|---|---|---|---|
+..B | 2 | 1 | 1 | B |
+....C | 3 | 2 | 2 | B |
+......D | 4 | 3 | 3 | B |
+........H | 8 | 4 | 4 | B |
+........I | 9 | 4 | 4 | B |
+......G | 7 | 3 | 3 | B |
+....E | 5 | 2 | 2 | B |
+....F | 6 | 2 | 2 | B |
SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
ID,
PARENT_ID,
DECODE(LEVEL, 1, 'Y', 'N') is_root,
LEVEL LVL,
connect_by_root STR ROOT_STR
FROM idb_hierarchical I
START WITH id = 3
CONNECT BY PARENT_ID = PRIOR ID;
SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL, ID, PARENT_ID, DECODE(LEVEL, 1, 'Y', 'N') is_root, LEVEL LVL, connect_by_root STR ROOT_STR FROM idb_hierarchical I START WITH id = 3 CONNECT BY PARENT_ID = PRIOR ID;
STR_LEVEL | ID | PARENT_ID | IS_ROOT | LVL | ROOT_STR |
---|---|---|---|---|---|
+..C | 3 | 2 | Y | 1 | C |
+....D | 4 | 3 | N | 2 | C |
+......H | 8 | 4 | N | 3 | C |
+......I | 9 | 4 | N | 3 | C |
+....G | 7 | 3 | N | 2 | C |
SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL,
ID,
PARENT_ID,
DECODE(LEVEL, 1, 'Y', 'N') is_root,
LEVEL LVL,
connect_by_root STR ROOT_STR
FROM idb_hierarchical I
START WITH PARENT_ID = 2
CONNECT BY PARENT_ID = PRIOR ID;
SELECT RPAD('+', LEVEL * 2 + 1, '.') || STR STR_LEVEL, ID, PARENT_ID, DECODE(LEVEL, 1, 'Y', 'N') is_root, LEVEL LVL, connect_by_root STR ROOT_STR FROM idb_hierarchical I START WITH PARENT_ID = 2 CONNECT BY PARENT_ID = PRIOR ID;
STR_LEVEL | ID | PARENT_ID | IS_ROOT | LVL | ROOT_STR |
---|---|---|---|---|---|
+..C | 3 | 2 | Y | 1 | C |
+....D | 4 | 3 | N | 2 | C |
+......H | 8 | 4 | N | 3 | C |
+......I | 9 | 4 | N | 3 | C |
+....G | 7 | 3 | N | 2 | C |
+..E | 5 | 2 | Y | 1 | E |
+..F | 6 | 2 | Y | 1 | F |
相关文章推荐
- oracle 层次查询判断叶子和根节点
- 【转】 oracle 层次查询判断叶子和根节点
- oracle查询树形结构某层级节点及叶子节点
- oracle层次查询的陷阱
- Oracle当中层次查询
- Oracle父节点及其子节点数据的查询
- oracle 树状查询,查询根节点
- Oracle - 层次查询
- mysql的逆袭:如何做oracle的start with connect by prior递归层次查询
- easyui tree 判断是否是叶子节点
- ORACLE中的层次结构查询
- QTreeView控件判断鼠标点击是否选中叶子节点
- 【oracle资料整理】--【7】子查询,层次查询,TOP 前几行,分页查询
- Oracle与SQL-Server数据库SQL"树查询"对比[按照父子节点关系递归拼接]
- 在10g以前来判断是否是根节点和叶子
- Oracle层次查询的基本用法
- Summary_Oracle 根据父节点查询子节点(递归查询)
- oracle 条件查询,比较运算符,逻辑运算符,特殊运算符,判断空值,大小写敏感,多行,多列子查询
- Oracle模糊查询(大小写判断)
- Mysql中的递归层次查询(根据父节点查找所有的子节点和根据子节点查询所有的父节点)的两种运用