sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan gengiver du en til mange relationer til XML med PostgreSQL

Prøv:

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
 

Dette vil give dig alle opgavegrupperne for p.id du har angivet.

Så:

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

Dette vil give dig den struktur, du har angivet.

Detaljer:XMLAGG , XML-funktioner

Tilsluttet udvalg vil se sådan ud:

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

Jeg kopierede simpelthen det første valg til FROM andet afsnit.



  1. Vil indekser blive brugt, hvis du forespørger på en undergruppe af indeksets kolonner?

  2. Er det muligt at behandle bindestreger og mellemrum ens i SQL?

  3. Konverter 'smalldatetime' til 'time' i SQL Server (T-SQL-eksempler)

  4. SÅDAN vælger du min fra cast varchar til int i mysql