Oracle クエリについてサポートが必要です。
これが私のセットアップです:
それぞれ「タスク」と「タイムシート」と呼ばれる2つのテーブルがあります。「タスク」テーブルは再帰的なもので、各タスクが複数のサブタスクを持つことができます。各タイムシートはタスク (「ルート」タスクとは限りません) に関連付けられており、その作業にかかった時間数が含まれています。
例:
タスク
id:1 | 名前: タスク A | 親 ID: NULL
id:2 | 名前: タスク A1 | 親 ID: 1
id:3 | 名前: タスク A1.1 | 親 ID: 2
id:4 | 名前: タスク B | 親 ID: NULL
id:5 | 名前: タスク B1 | 親 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 で発生します。私の問題を引き起こしているのは「内部結合」部分であることはわかっていますが、どうすればそれを取り除くことができるかわかりません。
この問題を解決する方法はありますか?
ありがとうございました