gpt4 book ai didi

oracle - 将 Connect by、inner join 和 sum 与 Oracle 混合在一起

转载 作者:行者123 更新时间:2023-12-01 00:02:08 43 4
gpt4 key购买 nike

我需要有关 oracle 查询的帮助。

这是我的设置:

我有 2 个表,分别称为“任务”和“时间表”。 “任务”表是一个递归表,这样每个任务可以有多个子任务。每个时间表都与一个任务(不一定是“根”任务)相关联,并包含处理它的小时数。

例子:

任务

编号:1 |名称: 任务 A | parent_id: NULL

编号:2 |名称:任务A1 |父 ID:1

编号:3 |名称:任务A1.1 |父 ID:2

编号:4 |名称: 任务 B | parent_id: NULL

编号:5 |名称:任务B1 | parent_id:4

时间表

编号:1 | task_id: 1 |小时数:1

编号:2 | task_id: 2 |小时数:3

编号:3 | task_id:3 |小时数:1

编号:5 | task_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 发生的情况。我知道是“内部连接”部分导致了我的问题,但我不确定如何摆脱它。

知道如何解决这个问题吗?

谢谢

最佳答案

这样的东西会起作用吗?我遇到过与您类似的情况,我只是从分层查询中删除了连接,然后才应用它以避免丢失行。

SELECT TaskName, Sum(ts.hours) "TotalHours" 
FROM (
SELECT replace(sys_connect_by_path(decode(level, 1, t.name), '~'), '~') As TaskName, t.id
FROM tasks t
START WITH PARENTOID=-1
CONNECT BY PRIOR t.id = t.parent_id
) tasks
INNER JOIN timesheets ts ON tasks.id=ts.task_id
GROUP BY TaskName Having Sum(ts.hours) > 0 ORDER BY TaskName

关于oracle - 将 Connect by、inner join 和 sum 与 Oracle 混合在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2922167/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com