【发布时间】:2014-03-20 16:24:42
【问题描述】:
我正在创建一个数据库来总结通过各种总线连接的电气负载系统。这个想法是能够检查没有总线超过其额定负载。我正在使用 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.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
这是正确的,因为使用我用来生成它的数据没有负载附加到 BUS 2。我还需要查看一行:
PARENT, GRANDPARENT, POWER, LEVEL
2 0 497 1
即201 和 202 的总和,加上可能直接连接到 BUS 2 的任何负载。
如何使总功率数据通过总线结构馈送到父总线?
【问题讨论】:
-
您可以发布示例创建表和插入以及您需要查看的确切结果吗?还有你使用的是什么 Oracle 版本?