Hãy thử:
SELECT p.id as pack_id,
XMLELEMENT(name taskgroup,
XMLATTRIBUTES(tg.id as id),
XMLAGG(XMLELEMENT(name task,
XMLATTRIBUTES(t.id as id)) as xml_task_group
FROM packages p
JOIN package_taskgroup pt ON p.id = pt.package_id
JOIN taskgroups tg on pt.taskgroup_id = tg.id
JOIN taskgroup_task tt on tg.id = tt.taskgroup_id
JOIN tasks t on tt.task_id = t.id
WHERE p.id = somePackageId
GROUP BY p.id, tg.id
Điều này sẽ cung cấp cho bạn tất cả các nhóm nhiệm vụ cho p.id
bạn đã chỉ định.
Sau đó:
SELECT XMLELEMENT(name package,
XMLATTRIBUTES(pack_id as id),
XMLAGG(xml_task_group))
FROM (previous SELECT here)
Điều này sẽ cung cấp cho bạn cấu trúc bạn đã chỉ định.
Chi tiết: XMLAGG , Các hàm XML
Lựa chọn đã tham gia sẽ trông như thế này:
SELECT XMLELEMENT(name package,
XMLATTRIBUTES(pack_id as id),
XMLAGG(xml_task_group))
FROM (SELECT p.id as pack_id,
XMLELEMENT(name taskgroup,
XMLATTRIBUTES(tg.id as id),
XMLAGG(XMLELEMENT(name task,
XMLATTRIBUTES(t.id as id)
))) as xml_task_group
FROM packages p
JOIN package_taskgroup pt ON p.id = pt.package_id
JOIN taskgroups tg on pt.taskgroup_id = tg.id
JOIN taskgroup_task tt on tg.id = tt.taskgroup_id
JOIN tasks t on tt.task_id = t.id
WHERE p.id = somePackageId
GROUP BY p.id, tg.id) t
GROUP BY pack_id
Tôi chỉ cần sao chép lựa chọn đầu tiên vào FROM
mệnh đề thứ hai.