【发布时间】:2010-05-27 14:49:04
【问题描述】:
我需要有关 oracle 查询的帮助。
这是我的设置:
我有 2 个表,分别称为“任务”和“时间表”。 “任务”表是一个递归表,这样每个任务可以有多个子任务。每个时间表都与一个任务(不一定是“根”任务)相关联,并包含在其上工作的小时数。
例子:
任务
id:1 |名称:任务A | parent_id: NULL
id:2 |名称:任务A1 | parent_id: 1
id:3 |名称:任务 A1.1 | parent_id: 2
id:4 |名称:任务B | parent_id: NULL
id:5 |名称:任务 B1 | parent_id: 4
时间表
id:1 |任务ID:1 |小时:1
id:2 |任务ID:2 |小时:3
id:3 |任务ID:3 |小时:1
id:5 |任务ID:5 |小时:1 ...
我想做什么:
我想要一个查询,该查询将返回在“任务层次结构”上工作的所有小时数的总和。如果我们看一下前面的例子,这意味着我想得到以下结果:
任务 A - 5 小时 |任务 B - 1 小时
一开始我试过这个
SELECT TaskName, Sum(Hours) "TotalHours"
FROM (
SELECT replace(sys_connect_by_path(decode(level, 1, t.name), '~'), '~') As TaskName,
ts.hours as hours
FROM tasks t INNER JOIN timesheets ts ON t.id=ts.task_id
START WITH PARENTOID=-1
CONNECT BY PRIOR t.id = t.parent_id
)
GROUP BY TaskName Having Sum(Hours) > 0 ORDER BY TaskName
它几乎可以工作。唯一的问题是,如果根任务没有时间表,它将跳过整个层次结构......但可能有子行的时间表,这正是任务 B1 发生的情况。我知道是“内部连接”部分导致了我的问题,但我不确定如何才能摆脱它。
知道如何解决这个问题吗?
谢谢
【问题讨论】:
-
我认为如果你颠倒表格的顺序并使用左外连接,即使没有时间表,你也会得到任务,以便可能工作......也许?
-
感谢您的帮助。在我的情况下进行左连接会导致一些主要的性能问题......即使这些表都被很好地索引了。
标签: oracle connect-by