sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLを使用してXMLと1対多の関係をレンダリングする方法

    試してみてください:

    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
    

    これにより、p.idのすべてのタスクグループが提供されます 指定しました。

    次に:

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

    これにより、指定した構造が得られます。

    詳細: XMLAGG XML関数

    参加したselectは次のようになります:

    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
    

    最初の選択をFROMにコピーしただけです 2番目の節。



    1. 同時支払い管理

    2. 2019データベースのトレンド– SQLとNoSQL、トップデータベース、単一データベースと複数データベースの使用

    3. MySQLの関係

    4. 'IN'句から順序を維持する