oracle树型sql树形结构查询询

Oracle树形结构实现
Oracle树形结构实现
我突然看见了一个函数CONNECT &
BY,就想起以前想做一个树形的结构:就是大类型表TB_INDUSTRYCATALOGUE中有字段INDUSTRYCATALOGUEID,name&
小类型表TB_INDUSTRYNAME中有字段INDUSTRYNAMEID,INDUSTRYCATALOGUEID,name
要实现每个大类型名下有树形的小类型名。
1.先创建一个表aabb,字段为id,name
导入TB_INDUSTRYCATALOGUE表中的数据:
insert& into&
aabb(id,name)
select& INDUSTRYCATALOGUEID,name
TB_INDUSTRYCATALOGUE;
2.在表aabb中加一个字段pid 更改字段pid都为0
Update &aabb set& pid =’0’;
3.类似创建表aa
结构和TB_INDUSTRYNAME一样,导入TB_INDUSTRYNAME表的数据
Insert &into& aa
Select &*& from
&TB_INDUSTRYNAME;
4.有可能小类型表中的INDUSTRYNAMEID和大类型表中的INDUSTRYCATALOGUEID有重复的数据,这样就会造成CONNECT
BY循环出错,第一次我就出现这个错误,所以避免重复可以把aa中的INDUSTRYNAMEID都加一个很大的数和INDUSTRYCATALOGUEID错开,我加了1000。
Update &aa& set&
INDUSTRYNAMEID=to_char(to_number(INDUSTRYNAMEID)+1000);
5.这样就可把aa的数据导入aabb了。
Insert &into&
aabb(id,pid,name)
&INDUSTRYNAMEID,INDUSTRYCATALOGUEID,name&
6.这样就可以查询了:为了效果好点可以先设一下页的大小
& Set pagesize 1000
其实SYS_CONNECT_BY_PATH这个函数是oracle9i才新提出来的!
& 它一定要和connect &
by子句合用!第一个参数是形成树形式的字段,第二个参数是父级和其子级分隔显示用的分隔符.&
说白了这个函数的作用就是为你清楚的构建出树结构的查询结果。
SYS_CONNECT_BY_PATH(name,&&
'&') namee
&from aabb
&start with pid='0'
&connect by prior id=
&环保&废纸
&环保&废金属
&环保&纺织废料
&环保&公共环卫设施
&环保&环保监测仪器
&环保&环保产品加工
&交通运输工具
&交通运输工具&电梯、缆车及配件
&交通运输工具&飞行器及配件
&交通运输工具&集装箱
&交通运输工具&二手交通产品及用具
select LPAD('& ', 4*level-1)||name namee
start with pid='0'
connect by prior id=
交通运输工具
电梯、缆车及配件
飞行器及配件
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。oracle&树形结构查询的方法
--CDID 菜单id
-- FCDID 父菜单id
--CDM 菜单名称
--level 菜单等级
SELECT CDID,FCDID,
&&&&&& DECODE( NVL(LEVEL2,0),
&&&&&&&&&&&&&&
0,SUBSTR('││││││',1,LEVEL1 - 1)||'└',
&&&&&&&&&&&&&&
DECODE(LEVEL2 - LEVEL1,
&&&&&&&&&&&&&&&&&&&&&
0,SUBSTR('││││││',1,LEVEL1 - 1)||'├',
&&&&&&&&&&&&&&&&&&&&&
1,SUBSTR('││││││',1,LEVEL1 - 1)||'├',
&&&&&&&&&&&&&&&&&&&&&&&
SUBSTR('││││││',1,LEVEL1 - 1)||'└'
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&
)||CDM CDM
SELECT CDID,CDM,FCDID,
&&&&&& LEVEL
LEVEL1,LEAD(LEVEL,1)& OVER (ORDER BY ROWNUM) LEVEL2
& FROM PF_MENU
& WHERE CDM&&'-'
CONNECT BY FCDID= PRIOR CDID START WITH& FCDID='0'
--ORDER SIBLINGS BY CDID
------------------------------------------------------------------------------------------------------------------------------------------下面为详细讲解(转的)
下面我们以PF_MENU这张表当作我们的数据表。
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http&#58;//blog.csdn.net/images/blog_csdn_net/juwuyi/MenuTree.gif"
TITLE="oracle&树形结构查询的方法" />
1、首先,我们查得整个表的数据:
//CDID:菜单ID; FCDID:父菜单ID;CDM:菜单名称。 FCDID=0是最高级菜单;CDM=- 是 分割线
SELECT CDID,FCDID,CDM FROM PF_MENU
得到的数据,如下(以下列举部分数据,不是完整的):
CDID FCDID CDM
抄表册设置
事件代码维护
30000 0 负荷控制
厂休控管理
下浮控投入
.......................
2、用CONNECT BY 查得树状的大致结构
SELECT CDID,CDM,FCDID&&&&&
&& FROM PF_MENU
& WHERE CDM&&'-'
CONNECT BY FCDID= PRIOR CDID START WITH& FCDID='0'
查得数据(部分数据):
CDID CDM FCDID
90000 有序用电 0
900002 有序用电指标 90000
77999 demo1 90000
99000 辅助管理 0
9909 事件代码维护 99000
99004 时段维护 99000
99005 数据项维护 99000
99006 定时任务维护 99000
99007 群组维护 99000
80000 档案管理 0
800001 SIM卡资产管理 80000
800002 终端资产管理 80000
800004 终端运行档案管理 80000
800008 档案维护 80000
800009 终端参数设置 80000
.............................
3、2中查出的数据虽然具备了初步的树状结构,但CDID没有从小到大排序(CDID是Number型的),下面我们将用ORDER
SIBLINGS BY来排序。
SELECT CDID,CDM,FCDID&&&&&
&& FROM PF_MENU
& WHERE CDM&&'-'
CONNECT BY FCDID= PRIOR CDID START WITH& FCDID='0'
ORDER SIBLINGS BY CDID
查得数据(部分数据):
CDID CDM FCDID
30000 负荷控制 0
3002 抄表册设置 30000
30001 保电控制 30000
30003 单户控制 30000
30004 遥控设置 30000
30005 剔除设置 30000
30006 功率控制 30000
30007 厂休控管理 30000
30008 下浮控投入 30000
30011 测试 30000
30012 单户日志 30000
50000 综合查询 0
50003 日志查询 50000
50004 终端操作记录查询 50000
60000 需求侧管理 0
4、在修改一个菜单时,它的上级菜单不能为自己,更不能为自己的子菜单,以下就是不显示自己和子菜单的查询。
//以下 990001 为 个人信息维护的菜单,它是系统维护的子菜单,同时又拥有自己的2个菜单
//当我们编辑990001菜单时,不能在父菜单选择中出现自己或者自己的子菜单
//以下语句对于自己的父菜单为0的菜单是没有效果的,所以为了达到真实的效果,我们需要加一个根菜单为:0& 根菜单
-1,也就是说最高级菜单是-1的菜单,而且CDID=0的菜单只有一个
SELECT CDID,CDM,FCDID&&&&&
&& FROM PF_MENU
& WHERE CDM&&'-'
CONNECT BY FCDID= PRIOR CDID AND
CDID&&'990001' START WITH&
ORDER SIBLINGS BY CDID
5、3中的数据已经很清晰了,我们继续把它的CDM用目录结构显示呢?我们需要用到Level属性,这是树状结构特有的
//以下假设我们的菜单最多只有5个级别
//我们用Lead函数来取得下一行菜单的Level2,自己的Level为Level1,Level2与Level1的关系我们用Decode来处理
//最后行的Level2位NULL,
//Level2&Level1&#58;说明自己有子菜单,
//Level2=Level1:说明下面还有同级别的菜单
//Level2&Level1,说明自己是这个级别的最后一个菜单
SELECT CDID,FCDID,
&&&&&& DECODE( NVL(LEVEL2,0),
&&&&&&&&&&&&&&
0,SUBSTR('││││││',1,LEVEL1 - 1)||'└',
&&&&&&&&&&&&&&
DECODE(LEVEL2 - LEVEL1,
&&&&&&&&&&&&&&&&&&&&&
0,SUBSTR('││││││',1,LEVEL1 - 1)||'├',
&&&&&&&&&&&&&&&&&&&&&
1,SUBSTR('││││││',1,LEVEL1 - 1)||'├',
&&&&&&&&&&&&&&&&&&&&&&&
SUBSTR('││││││',1,LEVEL1 - 1)||'└'
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&
)||CDM CDM
SELECT CDID,CDM,FCDID,
&&&&&& LEVEL
LEVEL1,LEAD(LEVEL,1)& OVER (ORDER BY ROWNUM) LEVEL2
& FROM PF_MENU
& WHERE CDM&&'-'
CONNECT BY FCDID= PRIOR CDID START WITH& FCDID='0'
ORDER SIBLINGS BY CDID
最后查得数据(部分数据):
├负荷控制
│├抄表册设置
│├保电控制
│├单户控制
│├遥控设置
│├剔除设置
│├功率控制
│├厂休控管理
│├下浮控投入
│└单户日志
├综合查询
│├日志查询
│└终端操作记录查询
├需求侧管理
最终效果图,我们把它放到一个SELECT控件中显示的结果:
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http&#58;//blog.csdn.net/images/blog_csdn_net/juwuyi/MenuSelect.gif"
TITLE="oracle&树形结构查询的方法" />
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Oracle递归查询 -
- ITeye技术网站
有的情况下,我们需要用递归的方法整理数据,这才程序中很容易做到,但是在数据库中,用SQL语句怎么实现?下面我以最典型的树形结构来说明下如何在Oracle使用递归查询。
为了说明方便,创建一张数据库表,用于存储一个简单的树形结构
create table TEST_TREE
NAME VARCHAR2(32)
ID是主键,PID是父节点ID,IND是排序字段,NAME是节点名称。初始化几条测试数据。
一、基本使用:
在Oracle中,递归查询要用到start
with 。。。。connect
prior。。。
具体格式是:
SELECT column
FROM table_name
START WITH column=value
CONNECT BY PRIOR 父主键=子外键
对于本例来说,就是:
test_tree d
d.id=d.pid
查询结果如下:
我们从结果中可以看到,记录已经是按照树形结构进行排列了,但是现在有个新问题,如果我们有这样的需求,就是不但要求结果按照树形结构显示,还要根据ind字段在每一个分支内进行排序,这个问题怎么处理呢?我们可能很自然的想到如下语句:
test_tree d
d.id=d.pid
order by d.ind
结果如下:
这显然不是我们想要的结果,那下面的这个语句呢?
(select dd.* from test_tree dd order by dd.ind) d
d.id=d.pid
结果如下:
这个结果看似对了,但由于一级菜单3节点下有一个节点的ind=0,导致一级菜单2被拍到了3下面。如果想使用类似这样的语句做到各分支内排序,则需要找到一个能够准确描述菜单级别的字段,但是对于示例表来说,不存在这么一个字段。
那我们如何实现需求呢?其实Oracle9以后,提供了一种排序“order siblings by”就可以实现我们的需求,用法如下:
test_tree d
d.id=d.pid
结果如下:
这样一来,查询结果就完全符合我们的要求了。
至于在Oracle8以前版本,或者其他数据库中如何实现类似的功能,希望大家来指教下,谢谢。
论坛回复 /
(9 / 8057)
写的蛮不错的,请求转载
随便转,呵呵,我也要学习下如何在Oracle8以前版本,或者其他数据库中实现类似的功能
浏览: 32260 次
来自: 北京
&div class=&quote_title ...
对于linux是不行的....
楼主,那个我遇到了 java.awt.Color这个不存在的错 ...
有没有代码啊,发我一份,我的始终获取不到old值.oracle树形结构表查询语句
[问题点数:50分,结帖人fanjinruo]
oracle树形结构表查询语句
[问题点数:50分,结帖人fanjinruo]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关推荐:
2014年5月 Oracle大版内专家分月排行榜第三
2014年10月 Oracle大版内专家分月排行榜第二2014年9月 Oracle大版内专家分月排行榜第二2014年6月 Oracle大版内专家分月排行榜第二2014年4月 Oracle大版内专家分月排行榜第二2014年3月 Oracle大版内专家分月排行榜第二2014年2月 Oracle大版内专家分月排行榜第二2013年11月 Oracle大版内专家分月排行榜第二
2014年11月 Oracle大版内专家分月排行榜第三2014年8月 Oracle大版内专家分月排行榜第三
2014年5月 Oracle大版内专家分月排行榜第三
2014年10月 Oracle大版内专家分月排行榜第二2014年9月 Oracle大版内专家分月排行榜第二2014年6月 Oracle大版内专家分月排行榜第二2014年4月 Oracle大版内专家分月排行榜第二2014年3月 Oracle大版内专家分月排行榜第二2014年2月 Oracle大版内专家分月排行榜第二2013年11月 Oracle大版内专家分月排行榜第二
2014年11月 Oracle大版内专家分月排行榜第三2014年8月 Oracle大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 excel树形结构 的文章

 

随机推荐