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

Oracle Connect By 使用实例(转)

2017-03-23 10:58 253 查看
原文链接:Oracle Connect By 使用实例

在实际开发中 connect by可以替代plsql或java中的循环间化开发代码,提高开发效率。如下是我在工作中遇到一个实际解决的问题

Oracle CONNECT BY的用法 http://www.linuxidc.com/Linux/2011-10/44224p2.htm

Oracle递归START WITH...CONNECT BY PRIOR子句用法 http://www.linuxidc.com/Linux/2013-01/78585.htm

Oracle 有表连接的connect by 的优化 http://www.linuxidc.com/Linux/2013-12/93455.htm

Oracle 树查询 性能优化纪实(start with, connect by) http://www.linuxidc.com/Linux/2011-04/35283.htm

Oracle Database 10g 中新的 CONNECT BY 特性 http://www.linuxidc.com/Linux/2011-06/37600.htm

具体场景:

原系统是一个管理宿舍信息的系统,dorm_room用于存放宿舍的房间信息具体表结构是

create table dorm_room(bno varchar2(2),fno varchar2(2),rno varchar2(2),bednum varchar2(2));

这里存放了楼栋号,层号,房间号,及房间中床位总数

具体数据如下

insert into dorm_room values(1,1,1,4);

insert into dorm_room values(1,1,2,4);

insert into dorm_room values(1,1,3,7);

也就是说有三个房间,前两个房间床位数都是4,最后一个房间的床位数是7

目前的需求是根据床位数显示出每个房间中所有床位的数据。期望结果是

1 1 1 1

1 1 1 2

1 1 1 3

1 1 1 4

1 1 2 1

1 1 2 2

1 1 2 3

1 1 2 4

1 1 3 1

1 1 3 2

1 1 3 3

1 1 3 4

1 1 3 5

1 1 3 6

1 1 3 7

如果用pl/sql根据每行的床位数判断循环次数,显示出每个房间的所有床位数,编写起来必然要书写较多行代码,因此选用

sql中的connect by的方式生成出所有的房间的床位数,具体sql为

select distinct bno,fno,rno,t.l

from (

select row_number()over(partition by bno,fno,rno order by level) rn,

bno,fno,rno,level l

from dorm_room

connect by level<=bedno

) t

order by bno,fno,rno

显示结果

BN FN RN L

-- -- -- ----------

1 1 1 1

1 1 1 2

1 1 1 3

1 1 1 4

1 1 2 1

1 1 2 2

1 1 2 3

1 1 2 4

1 1 3 1

1 1 3 2

1 1 3 3

BN FN RN L

-- -- -- ----------

1 1 3 4

1 1 3 5

1 1 3 6

1 1 3 7
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: