スキーマに多対多の関係がいくつかあります。たとえば、パッケージには多くのタスク グループがあり、タスク グループにはさらに多くのタスクがあります。すべてのテーブルは、パッケージの主キーとタスクグループの主キーなどを保持する多対多のテーブルを介してリンクされています。(XML は 1 対多であるため、これが厳密に必要ではないことはわかっていますが、より良い構造を思いつきませんでした)。
1対多の構造を反映して、クエリ結果をXMLとして取得することはできますか? したがって、結果は次のようになります。
<package id=1>
<taskgroup id=1>
<task id=1>
<task id=2>
</taskgroup>
<taskgroup id=2>
<task id=3>
</taskgroup>
</package>
XMLELEMENT()
関数とXMLATTRIBUTE()
関数を使用してすべてのタスクを取得することで、必要なものの一部を取得することができました。そのようです:
SELECT XMLELEMENT(name task,
XMLATTRIBUTES(p.name as packageName),
XMLELEMENT(name description, t.description),
XMLELEMENT(name tutorial,
XMLELEMENT(name someTaskChild1, t.data1)),
XMLELEMENT(name objectives,
XMLELEMENT(name someTaskChild2, t.data2)),
)
FROM packages p
INNER JOIN package_taskgroup pt ON p.id = pt.package_id
INNER JOIN taskgroups tg on pt.taskgroup_id = tg.id
INNER JOIN taskgroup_task tt on tg.id = tt.taskgroup_id
INNER JOIN tasks t on tt.task_id = t.id
WHERE p.id = somePackageId AND tg.id = someTaskGroupId
問題は、これらのタスクを親テーブル要素にグループ化する方法です。