sql >> Database >  >> RDS >> PostgreSQL

Hoe een-op-veel relaties naar XML te renderen met PostgreSQL

Probeer:

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

Dit geeft je alle taakgroepen voor de p.id je hebt opgegeven.

Dan:

SELECT XMLELEMENT(name package, 
                  XMLATTRIBUTES(pack_id as id),
                  XMLAGG(xml_task_group))
FROM (previous SELECT here)

Dit geeft je de structuur die je hebt opgegeven.

Details:XMLAGG , XML-functies

Aangesloten select ziet er als volgt uit:

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

Ik heb gewoon de eerste selectie gekopieerd naar FROM clausule van de tweede.



  1. 2019 Open Source Database Report:Topdatabases, Public Cloud vs. On-Premise, Polyglot Persistence

  2. Haal de totale recordgroei in de loop van de tijd op in mysql

  3. Hoe een virtuele tabel genereren om een ​​reeks datums in PostgreSQL te genereren?

  4. Is het goed om altijd de join-clausule in Oracle te gebruiken?