这里是我的设置:
我有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 | task_id:1 |小时:1
id:2 | task_id:2 |小时:3
id:3 | task_id:3 |小时:1
id:5 | task_id:5 |时间:1 ...
我想做的事:
我想要一个查询,将返回一个“任务层次”工作的所有时间的总和。如果我们看一下前面的例子,这意味着我想得到以下结果:
任务A - 5小时|任务B - 1小时(S)
起初我想这
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中发生的情况。我知道这是造成我的问题的“内部连接”部分,但我不知道我该如何摆脱它。
任何想法如何解决这个问题?
谢谢
2010-05-27
François
+0
我认为,如果你颠倒表的顺序,并使用左外连接,你会得到任务,即使没有时间片上,从而*威力*工作...也许? –
2010-05-27 15:04:27
+0
感谢您的帮助。在我的情况下进行左连接会导致一些主要的性能问题......即使表格索引良好,并且所有表格都是如此。 –
2010-05-27 15:30:47