PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak renderować relacje jeden do wielu w XML za pomocą PostgreSQL

Wypróbuj:

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

To da ci wszystkie grupy zadań dla p.id określiłeś.

Następnie:

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

W ten sposób uzyskasz określoną strukturę.

Szczegóły:XMLAGG , Funkcje XML

Połączone zaznaczenie będzie wyglądać tak:

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

Po prostu skopiowałem pierwszy wybór do FROM klauzula drugiego.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przypisanie wartości zmiennej za pomocą klauzuli RETURNING

  2. Unikaj błędu PG::InvalidTextRepresentation podczas używania UUID Postgresa w Railsach

  3. Jak zapisać dane z przecinkiem zmieniającym się, które przechodzi przez wyzwalacz?

  4. PHP Połącz się z PostgreSQL za pomocą ssh2_tunnel

  5. Django emuluje zachowanie wyzwalacza bazy danych podczas zbiorczego wstawiania/aktualizowania/usuwania