树状查询是否可以获取到起始节点并分组

qinchun36 2011-09-28 11:47:54
有一个单位表,字段 nparentcorpid1 为上级单位 id,字段 nlevelid 记录此单位的级次。
我已经知道如何查单位 13 及其所有下级单位
select id, nparentcorpid1, nlevelid, 100 balance
from client c
start with id = 13
connect by prior id = nparentcorpid1

结果:

ID NPARENTCORPID1 NLEVELID BALANCE
13 10 2 100
41 13 3 100
43 13 3 100
44 13 3 100
45 13 3 100
46 13 3 100
47 13 3 100
48 13 3 100
50 13 3 100

以及金额的求和
select 13 rootid, SUM(100) balanceSum
from client c
start with id = 13
connect by prior id = nparentcorpid1

结果为
ROOTID	BALANCESUM
13 900


我现在疑惑的是关于求和的时候,rootid可否从start with的条件里面获得,如果将起始条件放宽,比如
select id, nparentcorpid1, nlevelid, 100 balance
from client c
start with id in (13,14,15)
connect by prior id = nparentcorpid1

是否能够只写出一个SQL,获取到这样的结果:
ROOTID	BALANCESUM
13 900
14 200
13 500

(不是通过程序指定三次参数执行三次查询的方式)
...全文
220 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
opps_zhou 2011-09-28
  • 打赏
  • 举报
回复

with tbl as
(
select 13 as id, 10 as mgrid, 2 as ilevel, 100 as blance from dual
union all
select 41 as id, 13 as mgrid, 3 as ilevel, 100 as blance from dual
union all
select 42 as id, 13 as mgrid, 3 as ilevel, 100 as blance from dual
union all
select 43 as id, 13 as mgrid, 3 as ilevel, 100 as blance from dual
union all
select 14 as id, 10 as mgrid, 2 as ilevel, 100 as blance from dual
union all
select 44 as id, 14 as mgrid, 3 as ilevel, 100 as blance from dual
union all
select 45 as id, 14 as mgrid, 3 as ilevel, 100 as blance from dual
)
select id, sum(blance) as blance
from (select connect_by_root id as id, blance
from tbl
start with ilevel = 2
connect by prior id = mgrid) t
group by id;

ID BLANCE
---------- ----------
13 400
14 300

iqlife 2011-09-28
  • 打赏
  • 举报
回复
用LEVEL,树深度来判断
ngx20080110 2011-09-28
  • 打赏
  • 举报
回复

select empno, mgr, ename, sal,level
from scott.emp
start with empno in (7902, 7698)
connect by prior empno = mgr;

EMPNO MGR ENAME SAL LEVEL
---------- ---------- ---------- ---------- ----------
7902 7566 FORD 3000 1
7369 7902 SMITH 800 2
7698 7839 BLAKE 2850 1
7499 7698 ALLEN 1600 2
7521 7698 WARD 1250 2
7654 7698 MARTIN 1250 2
7844 7698 TURNER 1500 2
7900 7698 JAMES 950 2

select decode (level, 1, empno, mgr), sum(sal)
from scott.emp
start with empno in (7902, 7698)
connect by prior empno = mgr
group by decode (level, 1, empno, mgr);

DECODE(LEVEL,1,EMPNO,MGR) SUM(SAL)
------------------------- ----------
7698 9400
7902 3800
dawugui 2011-09-28
  • 打赏
  • 举报
回复
你问问这个帖的楼主:

http://topic.csdn.net/u/20110928/00/9c3d7fa4-cb77-44e0-b81d-bcc862cade6c.html
qinchun36 2011-09-28
  • 打赏
  • 举报
回复
多谢各位,问题以解决,关键是 connect_by_root 这个东西。
 Ajax基础  使用Ajax发送异步请求  在请求和响应中使用XML  使用JSON进行数据传输 DOM基础  DOM是”Document Object Model”(文档对象模型)的首字母缩写。当创建了一个网页并把它加载到Web浏览器中时,就会在幕后创建一个文档对象模型  DOM表示被加载到浏览器窗口里的当前页面:浏览器向我们提供了当前页面的模型,而我们可以通过JavaScript访问这个模型  DOM把一份文档表示为一棵树  如下的HTML页面:  浏览器加载该页面并将之转换为树形结构:  DOM树中的一切是以最外层的HTML包含元素,即html元素开始的。使用树的比喻,这叫做根元素(root element)  从根流出的线表示不同标记部分之间的关系。head和body元素是html根元素的孩子(child);title是head的孩子,而文本 “Trees, trees, everywhere”是title的孩子;相对的,head是title的父亲(parent),title是文本 “Trees, trees, everywhere” 的父亲。处在同一层次的且互不包含的两个分支(如head和body)之间称为兄弟(sibling)关系。整个树就这样组织下去,直到浏览器获得与上图类似的结构  通常把这样的树结构成为一棵节点节点 (node)  DOM文档是由节点构成的集合,此时的节点是文档树上的树枝或者树叶  DOM中节点的类型:  元素节点(element node),诸如、

XML - 报表数据的新大陆,共221页,45万余字,推荐下载使用! 随着B/S系统的普及和XML技术的深入应用,越来越多的数据包裹着XML的外衣被存储和扔来扔去。这些数据很多源自数据库,但经过一定的处理,数据更精简,更贴近应用。如果报表工具能利用这些XML数据,则可以减少数据库查询和报表数据运算操作,因为这些XML数据的始作俑者已经完成了这些操作。因此说XML是报表数据的新大陆。 传统的报表工具都是只能处理关系型数据库,基本上不能处理其他数据。随着时代的发展,一些报表工具加上了处理XML文档的能力,但需要编程,编写并配置插件,如此报表程序结构复杂,接口众多,用户还需要根据各种规范动手编写程序,若XML文档格式有很多种,就需要编写很多种的插件,报表开发量不小。 如果实现了一种能处理XML文档,从中获得报表数据的通用方法。则在定制报表模板的时候就教育报表引擎如何从XML文档获得数据,则对于所有的或大部分的XML文档无需编程,可减少报表开发量。 那么如何通用的处理具有复杂树状结构的XML文档呢? 大家知道,处理XML文档有两种模式,一个是DOM方式,另一个是流模式。DOM方式处理方便,但速度慢耗内存,流模式处理速度快,省内存但使用不方便。对于.NET平台,使用System.Xml.XmlDocument对象来使用DOM方式处理XML文档,而使用XmlReader 来使用流模式处理XML文档。 W3C国际标准组织设计XML文档的目标是方便的存储和交换小型数据包,而不考虑数据的冗余。因此若实际系统中出现巨大的XML文档,则大多数情况下可以认为是不恰当的使用XML技术。因此我认为报表工具不应当处理巨大的XML文档,在此前提下,为了实现方便,采用DOM方式来处理XML文档。 在.NET中使用XmlDocument加载一个XML文档后,会形成一个以XmlDocument为根节点的XML对象树状结构,面对这个XML树结构,获取其中的数据方法很自然的就是使用XPath技术了。XPath技术就是在XML树状结构中,以某个节点作为起始节点,使用特定的描述表示的路径移动到其他的节点,一般的是向其下层节点移动,比如移动到某个子节点或孙节点,移动到某个属性等等。 传统的报表数据源模型是两层的,即使扩展到可以处理XML文档也只能处理一次,既从根节点出发,使用某个XPath 获得字段的值。如此只能处理一次,处理完毕后XML就被扔掉了。但很多时候需要对XML文档进行进一步处理。此时传统的两层报表数据源模型是不够的。 ......

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧