我正在建立一个数据库,以总结一个电力负荷系统,通过各种公共汽车连接。这样做的目的是要能够检查是否有超过其负载等级的总线。我正在使用APEX和Oracle数据库。
我有两张桌子,LOAD和BUS。
LOAD有列IDENTIFIER, PARENT_BUS, POWER
BUS有列IDENTIFIER, PARENT_BUS
(这只是表的简化,但其他数据与这个问题无关,我不认为)
我创建了一个表结构,看起来有点像这样:
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_BUS到BUS.IDENTIFIER的外键链接到总线表中的另一总线。load表中的负载还通过外键链接到总线:即LOAD.PARENT_BUS到BUS.IDENTIFIER。通常会有数百甚至数千的负载,连接到几十辆公共汽车。
注意到:负载可以附加在总线结构中的任何位置,并且可以有任意级别的总线(尽管我在示例中只显示了两个级别-三个或更多级别是不常见的,但并非不可能)。
我需要把每一层的所有负载加在一起,然后把它加到下一个更高的公共汽车上。也就是说,对于BUS 101,我需要LOAD 1001 + LOAD 1002 + LOAD 1007之和,对于BUS 1,我需要BUS 101 + BUS 102 + LOAD 1000 + LOAD 1009之和。
我试过这样做:
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;这给了我
PARENT, GRANDPARENT, POWER, LEVEL
201 2 307.6 2
202 2 189.4 2这是正确的,因为使用我用来生成这个的数据,没有负载附加到总线2。我还需要看到一行:
PARENT, GRANDPARENT, POWER, LEVEL
2 0 497 1也就是说,201和202的总和,加上任何可能直接连接到总线2的负载。
我怎样才能通过总线结构将汇总的电源数据输入父总线?
发布于 2014-02-20 01:31:55
您的部分问题是,您已经将总线的分层结构实现为邻接列表,考虑到您要做的事情以及我假设的数据的性质(总线相对静态,负载相对动态),这不是最简单或最有效的方法。
查看this问题,了解各种表示数据的方法。看看问题中的第二个环节,让你开始吧。
不费吹灰之力,我建议您实现路径枚举存储方法,因为它似乎几乎是总线in中固有的。
https://stackoverflow.com/questions/21895740
复制相似问题