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');

[sql] view plaincopy

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;

[sql] view plaincopy

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_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中,ID为8、9、 7、5、6、12、13都没有子节点,因此称为叶节点。

1.oracle9i 查询叶节点

只显示叶子节点SQL

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;

[sql] view plaincopy

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_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

显示所有节点,标明该行是否为叶节点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;

[sql] view plaincopy

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_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;

[sql] view plaincopy

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_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

根节点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;

[sql] view plaincopy

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_LEVEL     ID     PARENT_ID     LVL     ROOT_STR

+..B     2     1     1     B

标明根节点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;

[sql] view plaincopy

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_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和connect_by_root

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;

[sql] view plaincopy

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_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,

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;

[sql] view plaincopy

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_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;

[sql] view plaincopy

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_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

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;

[sql] view plaincopy

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_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

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;

[sql] view plaincopy

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_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

转载:

http://blog..net/zhangdaiscott/article/details/6721313

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐