将 Connect by、内连接和求和与 Oracle 混合在一起
我需要有关 Oracle 查询的帮助。
这是我的设置:
我有两个表,分别称为“任务”和“时间表”。 “任务”表是一个递归表,这样每个任务可以有多个子任务。每个时间表都与一个任务(不一定是“根”任务)相关联,并包含处理该任务的小时数。
示例:
任务
id:1 |名称:任务A |父 ID: NULL
ID:2 |名称:任务A1 |父 ID:1
ID:3 |名称:任务A1.1 |父 ID:2
ID:4 |名称:任务B |父 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 所发生的情况。我知道是“内部连接”部分导致了我的问题,但我不确定如何摆脱它。
知道如何解决这个问题吗?
谢谢
I need help with a oracle query.
Here is my setup:
I have 2 tables called respectively "tasks" and "timesheets". The "tasks" table is a recursive one, that way each task can have multiple subtasks. Each timesheet is associated with a task (not necessarily the "root" task) and contains the number of hours worked on it.
Example:
Tasks
id:1 | name: Task A | parent_id: NULL
id:2 | name: Task A1 | parent_id: 1
id:3 | name: Task A1.1 | parent_id: 2
id:4 | name: Task B | parent_id: NULL
id:5 | name: Task B1 | parent_id: 4
Timesheets
id:1 | task_id: 1 | hours: 1
id:2 | task_id: 2 | hours: 3
id:3 | task_id:3 | hours: 1
id:5 | task_id:5 | hours:1
...
What I want to do:
I want a query that will return the sum of all the hours worked on a "task hierarchy". If we take a look at the previous example, It means I would like to have the following results:
task A - 5 hour(s) | task B - 1 hour(s)
At first I tried this
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
And it almost work. THe only problem is that if there are no timesheet for a root task, it will skip the whole hieararchy... but there might be timesheets for the child rows and it is exactly what happens with Task B1. I know it is the "inner join" part that is causing my problem but I'm not sure how can I get rid of it.
Any idea how to solve this problem?
Thank you
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
像这样的东西会起作用吗?我遇到过与您类似的情况,我只是从分层查询中删除了联接,然后才应用它以避免丢失行。
Would something like this work? I've had cases similar to yours, and I simply removed the join from the hierarchical query and applied it only afterward to avoid losing rows.
你试过这个吗?
Have you tried this?
如果您使用左外连接而不是普通连接,您可能会得到输出。
If you use left outer join instead of normal join, you may get the output.