使用PL/Sql查询具有层次连接的数据
2004-12-14 11:43
573 查看
场景分析:在项目开发时,遇到了这样一种情况:对指定机关单位的月结数据进行统计时,需要包括下级所有单位的数据。可是机关单位的层次是多级的,如:省级——市级——区县级——街道。
而我的表TBL1结构设计是
机关代码(jg) 业务数据列1(a) 业务数据列2(b) …
机关表TBL2设计如下:
机关代码(jg) 上级机关(sj) …
要是传递一个当前机关代码,通过一个sql语句查询出当前机关和所有下级机关数据就好了。用的数据库是Oracle,开始我采取的方式是,程序先通过递归获得当前机关和所有下级机关的集合,然后拼sql用in子句查询。这样虽可以解决问题,可我总觉得别扭。后来发现Oracle的PL/SQL原来可以查询出这种多层次数据。
如下(假设当前税务机关变量值为1234):
SLEECT SUM(A), SUM(B) FROM TBL1 WHERE TBL1.JG IN ( select JG from TBL2 where TBL2.SJ = '1234' or (TBL2.JG in (select TBL2.SJ from TBL2 start with TBL2.SJ ='1234' connect by TBL2.SJ = prior TBL2.JG)) )
通过一个并不算复杂的sql语句就解决了问题,避免了两次访问数据库。
而我的表TBL1结构设计是
机关代码(jg) 业务数据列1(a) 业务数据列2(b) …
机关表TBL2设计如下:
机关代码(jg) 上级机关(sj) …
要是传递一个当前机关代码,通过一个sql语句查询出当前机关和所有下级机关数据就好了。用的数据库是Oracle,开始我采取的方式是,程序先通过递归获得当前机关和所有下级机关的集合,然后拼sql用in子句查询。这样虽可以解决问题,可我总觉得别扭。后来发现Oracle的PL/SQL原来可以查询出这种多层次数据。
如下(假设当前税务机关变量值为1234):
SLEECT SUM(A), SUM(B) FROM TBL1 WHERE TBL1.JG IN ( select JG from TBL2 where TBL2.SJ = '1234' or (TBL2.JG in (select TBL2.SJ from TBL2 start with TBL2.SJ ='1234' connect by TBL2.SJ = prior TBL2.JG)) )
通过一个并不算复杂的sql语句就解决了问题,避免了两次访问数据库。
相关文章推荐
- oracle 数据库的管理工具 PL/SQL_Developer 的简易使用 与Java 连接并查询显示出数据
- 请使用PL/SQL来按父子层次关系查询出表的所有数据
- [Oracle PL/SQL]当数据表设计成具有父ID的时候,当需要选择所有与父ID同根生的所有节点的时候,使用的SQL语句
- PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理
- (转)PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理
- 为什么数据可以从pl/sql查出来而使用ado.net查询,结果却是空?
- Oracle SQL使用笛卡尔连接、正则表达式和层次查询、union all、unpiovt 解决多列值筛选、列转行问题
- PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理
- PL/SQL Developer 使用中文条件查询时无数据的解决方法(转)
- [Oracle PL/SQL]当数据表设计成具有父ID的时候,当需要选择所有与父ID同根生的所有节点的时候,使用的SQL语句
- java JDBC 连接数据库查询数据与直接使用sql的疑问
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行
- 【转】PL/SQL编辑数据"这些查询结果不可更新,请包括ROWID或使用SELECT...FOR UPDATE获得可更新结果"处理
- java JDBC 连接数据库查询数据与直接使用sql的疑问
- 30. PL/SQL Developer连接服务器查询时,数据乱码处理
- [sql]使用自连接查询多对一数据
- 使用PL/SQL远程连接发现中文数据乱码
- oracle12c JSON数据 使用SQL语句实现多表左外连接 显示无效数据 分页查询
- Oracle 学习:PL/SQL循序渐进全面学习教程--课程十三 使用组合数据类型* 游标操纵数据
- SQL 基础之使用子查询检索数据(二十二)