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

oracle 层次查询判断叶子和根节点

2016-03-30 00:00 435 查看
oracle 9i判断是叶子或根节点,是比较麻烦的一件事情,SQL演示脚本如下:

view plain
copy to clipboard
print
?

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 plain
copy to clipboard
print
?

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;

表1:数据清单

STR_LEVELIDPARENT_IDLVL
+..A11
+….B212
+……C323
+……..D434
+……….H845
+……….I945
+……..G734
+……E523
+……F623
+..J101
+….K11102
+……L12113
+….M13102
在表1中,ID为8、9、 7、5、6、12、13都没有子节点,因此称为叶节点。

1.oracle9i 查询叶节点

只显示叶子节点SQL

view plain
copy to clipboard
print
?

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;

表2

STR_LEVELIDPARENT_IDLVL
+……….H845
+……….I945
+……..G734
+……E523
+……F623
+……L12113
+….M13102
显示所有节点,标明该行是否为叶节点SQL

view plain
copy to clipboard
print
?

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;

表3

STR_LEVELIDPARENT_IDLVLIS_LEAF
+..A11N
+....B212N
+......C323N
+........D434N
+..........H845Y
+..........I945Y
+........G734Y
+......E523Y
+......F623Y
+..J101N
+....K11102N
+......L12113Y
+....M13102Y

oracle 9i 查询根节点

view plain
copy to clipboard
print
?

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;

表4

STR_LEVELIDPARENT_IDLVL
+..B211
+....C322
+......D433
+........H844
+........I944
+......G733
+....E522
+....F622
根节点ID应该为3、5、6,即lvl为1即可

查询根节点,只显示根节点SQL

view plain
copy to clipboard
print
?

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;

表5

STR_LEVELIDPARENT_IDLVLROOT_STR
+..B211B
标明根节点SQL

view plain
copy to clipboard
print
?

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;

表6

STR_LEVELIDPARENT_IDIS_ROOTLVLROOT_STR
+..B21Y1B
+....C32N2B
+......D43N3B
+........H84N4B
+........I94N4B
+......G73N3B
+....E52N2B
+....F62N2B
在oracle 10g提供了connect_by_isleaf和connect_by_root

oracle 10g用connect_by_isleaf判断叶节点

view plain
copy to clipboard
print
?

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;

表7

STR_LEVELIDPARENT_IDLVL
+..........H845
+..........I945
+........G734
+......E523
+......F623
+......L12113
+....M13102
view plain
copy to clipboard
print
?

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;

表8

STR_LEVELIDPARENT_IDLVLIS_LEAF
+..A11N
+....B212N
+......C323N
+........D434N
+..........H845Y
+..........I945Y
+........G734Y
+......E523Y
+......F623Y
+..J101N
+....K11102N
+......L12113Y
+....M13102Y

oracle 10g用connect_by_root判断根节点

view plain
copy to clipboard
print
?

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;

表9

STR_LEVELIDPARENT_IDLVLROOT_STR
+..B211B
+....C322B
+......D433B
+........H844B
+........I944B
+......G733B
+....E522B
+....F622B
view plain
copy to clipboard
print
?

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;

表10

STR_LEVELIDPARENT_IDIS_ROOTLVLROOT_STR
+..C32Y1C
+....D43N2C
+......H84N3C
+......I94N3C
+....G73N2C
view plain
copy to clipboard
print
?

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;

表11

STR_LEVELIDPARENT_IDIS_ROOTLVLROOT_STR
+..C32Y1C
+....D43N2C
+......H84N3C
+......I94N3C
+....G73N2C
+..E52Y1E
+..F62Y1F
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: