首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle SQL中任意传家宝节点求和

Oracle SQL中任意传家宝节点求和
EN

Stack Overflow用户
提问于 2014-02-20 00:37:39
回答 1查看 31关注 0票数 0

我正在建立一个数据库,以总结一个电力负荷系统,通过各种公共汽车连接。这样做的目的是要能够检查是否有超过其负载等级的总线。我正在使用APEX和Oracle数据库。

我有两张桌子,LOADBUS

LOAD有列IDENTIFIER, PARENT_BUS, POWER

BUS有列IDENTIFIER, PARENT_BUS

(这只是表的简化,但其他数据与这个问题无关,我不认为)

我创建了一个表结构,看起来有点像这样:

代码语言:javascript
复制
BUS 0 (root bus)
  BUS 1
   -LOAD 1000
   -LOAD 1009
   BUS 101
     -LOAD 1001
     -LOAD 1002
     -LOAD 1007
   BUS 102
     -LOAD 1003
  BUS 2
   BUS 201
     -LOAD 1004
     -LOAD 1008
   BUS 202
     -LOAD 1005
     -LOAD 1006

有一组总线使用从BUS.PARENT_BUSBUS.IDENTIFIER的外键链接到总线表中的另一总线。load表中的负载还通过外键链接到总线:即LOAD.PARENT_BUSBUS.IDENTIFIER。通常会有数百甚至数千的负载,连接到几十辆公共汽车。

注意到:负载可以附加在总线结构中的任何位置,并且可以有任意级别的总线(尽管我在示例中只显示了两个级别-三个或更多级别是不常见的,但并非不可能)。

我需要把每一层的所有负载加在一起,然后把它加到下一个更高的公共汽车上。也就是说,对于BUS 101,我需要LOAD 1001 + LOAD 1002 + LOAD 1007之和,对于BUS 1,我需要BUS 101 + BUS 102 + LOAD 1000 + LOAD 1009之和。

我试过这样做:

代码语言:javascript
复制
SELECT bus.IDENTIFIER AS "PARENT", bus.PARENT_BUS AS "GRANDPARENT", SUM(load.POWER) AS "POWER", level
FROM BUS_DATA bus
LEFT JOIN LOAD_DATA load
ON load.PARENT_BUS = bus.IDENTIFIER
START WITH bus.PARENT_BUS = '0' -- This is the root that all buses eventually link to
CONNECT BY PRIOR bus.IDENTIFIER = bus.PARENT_BUS
GROUP BY bus.IDENTIFIER, bus.PARENT_BUS, level;

这给了我

代码语言:javascript
复制
PARENT, GRANDPARENT, POWER, LEVEL
201     2            307.6  2
202     2            189.4  2

这是正确的,因为使用我用来生成这个的数据,没有负载附加到总线2。我还需要看到一行:

代码语言:javascript
复制
PARENT, GRANDPARENT, POWER, LEVEL
2       0            497    1

也就是说,201和202的总和,加上任何可能直接连接到总线2的负载。

我怎样才能通过总线结构将汇总的电源数据输入父总线?

EN

回答 1

Stack Overflow用户

发布于 2014-02-20 01:31:55

您的部分问题是,您已经将总线的分层结构实现为邻接列表,考虑到您要做的事情以及我假设的数据的性质(总线相对静态,负载相对动态),这不是最简单或最有效的方法。

查看this问题,了解各种表示数据的方法。看看问题中的第二个环节,让你开始吧。

不费吹灰之力,我建议您实现路径枚举存储方法,因为它似乎几乎是总线in中固有的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21895740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档