对"一个非常难的查询问题(部门上下级的关系)"之解答的完善
2008-04-27 09:21
716 查看
这是一个CSDN老帖:
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=170559
我是抱着学习的心态看这个帖子的,下面把握学习结果总结一下。
楼主的问题是这样的:
--------------------------------------------------------------------------------
表A: id name 1 a 2 b 3 c 4 d 5 e 表B(id1,id2都与A表的id关联,是联合主外键): id1 id2 1 2 2 3 2 4 3 5 这是一个部门上下级的关系,前面的是上级,后面的下级,我想得到所有部门的列表,按照级别关系写成完整的字串,结果如下: id full_name 1 a 2 a/b 3 a/b/c 4 a/b/d 5 a/b/c/d 请问怎么写?存储过程或函数都可以,十分感谢!
---------------------------------------------------------
问题的关键是把用LEVEL关键字把层次关系搞搞清楚。
selectlevelfromtable_Bconnectbypriorid2=id1startwithid1=0;
LEVEL---------- 1 2 3 4 3
SQL>selectlevelfromtable_Bconnectbypriorid2=id1startwithid1=1;
LEVEL---------- 1 2 3 2
SQL>selectlevelfromtable_Bconnectbypriorid2=id1startwithid1=2;
LEVEL---------- 1 2 1
SQL>selectlevelfromtable_Bconnectbypriorid2=id1startwithid1=3;
LEVEL---------- 1
SQL>selectlevelfromtable_Bconnectbypriorid2=id1startwithid1=4;
LEVEL----------
SQL>selectlevelfromtable_Bconnectbypriorid2=id1startwithid1=5;
LEVEL----------
可以看出,LEVEL值表示id1领导下人员id2在id1集团所处的层数,被领导者紧跟在byprior后面。
selectlpad(id2,level*length(id2),'')id, 2 ltrim(sys_connect_by_path(id2,'/'),'/')path 3 fromTable_B 4 connectbypriorid2=id1 5 startwithid1=0 6 /
ID PATH----------------------------------------------------------------------------------------------------------------------------------------------------------------1 1 2 1/2 3 1/2/3 5 1/2/3/5 4 1/2/41
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=170559
我是抱着学习的心态看这个帖子的,下面把握学习结果总结一下。
楼主的问题是这样的:
--------------------------------------------------------------------------------
表A: id name 1 a 2 b 3 c 4 d 5 e 表B(id1,id2都与A表的id关联,是联合主外键): id1 id2 1 2 2 3 2 4 3 5 这是一个部门上下级的关系,前面的是上级,后面的下级,我想得到所有部门的列表,按照级别关系写成完整的字串,结果如下: id full_name 1 a 2 a/b 3 a/b/c 4 a/b/d 5 a/b/c/d 请问怎么写?存储过程或函数都可以,十分感谢!
---------------------------------------------------------
问题的关键是把用LEVEL关键字把层次关系搞搞清楚。
selectlevelfromtable_Bconnectbypriorid2=id1startwithid1=0;
LEVEL---------- 1 2 3 4 3
SQL>selectlevelfromtable_Bconnectbypriorid2=id1startwithid1=1;
LEVEL---------- 1 2 3 2
SQL>selectlevelfromtable_Bconnectbypriorid2=id1startwithid1=2;
LEVEL---------- 1 2 1
SQL>selectlevelfromtable_Bconnectbypriorid2=id1startwithid1=3;
LEVEL---------- 1
SQL>selectlevelfromtable_Bconnectbypriorid2=id1startwithid1=4;
LEVEL----------
SQL>selectlevelfromtable_Bconnectbypriorid2=id1startwithid1=5;
LEVEL----------
可以看出,LEVEL值表示id1领导下人员id2在id1集团所处的层数,被领导者紧跟在byprior后面。
selectlpad(id2,level*length(id2),'')id, 2 ltrim(sys_connect_by_path(id2,'/'),'/')path 3 fromTable_B 4 connectbypriorid2=id1 5 startwithid1=0 6 /
ID PATH----------------------------------------------------------------------------------------------------------------------------------------------------------------1 1 2 1/2 3 1/2/3 5 1/2/3/5 4 1/2/41
相关文章推荐
- 对"一个非常难的查询问题(部门上下级的关系)"之解答的完善
- 对"一个非常难的查询问题(部门上下级的关系)"之解答的
- 写了一个查询数据库的程序,不熟的Tomcat6。查询条件为英文时运行正常,为中文时出现乱码。后在tomcap的server.xml中加入useBodyEncodingForURI="true解决了问题
- 建了一个"symbina 技术"邮件列表,欢迎大加入到这个群,讨论symbian C++相关的技术问题!
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题(非原创,摘自书中)
- 无法打开"cv.h"问题解答
- ibatis中动态查询表返回用resultClass="java.util.HashMap" 的问题
- 【转】一个问题引发的"血案" 之 文件的读写原理(fread, fwrite, fflush)
- 非常不理解的一个问题。dudu看了请解答下!
- 知乎问题"房间里100个人,每人1000元,他们玩一个游戏,每轮游戏中,每个人拿出1元,随机给另一个人,最后他们的财富分布是怎样的"实践解答
- Oracle与SQL-Server数据库SQL"树查询"对比[按照父子节点关系递归拼接]
- 一个CDialog初始化时的异常问题 Error: no data exchange control with ID 0x%04X./n ", nIDC
- 今天遇到一个问题,原来在html的form中如果只有一个type="text"的控件,如果在text中点击回车键,就是自动提交表单!
- 哥发明的 一个ssh整合时解决dao层代码冗余问题的"一点儿不漏"型抽取法!!!!
- Microsoft JET Database Engine 错误 '80004005' 操作必须使用一个可更新的查询。问题解决办法
- 解决"未能加载文件或程序集,或它的某一个依赖项,试图加载格式不正确的程序"问题一法
- 关于String s1 = new String("abc") 创建一个对象问题和Java常量池总结
- "java.lang.NoClassDefFoundError"错误——一个关于classpath设置的问题
- 关于throw runtime_error("IO stream corrupted");的一个问题