我在portgres中有三个表,分别是Customer、Download、Games,字段如下:,

|-----------|
| Customer  |
|-----------|
|  cust_ID  |
|-----------|
|   name    |
|-----------|
|  country  |
|-----------|

|-----------|
| Download  |
|-----------|
|  cust_ID  |
|-----------|
|  game_ID  |
|-----------|
|  version  |
|-----------|

|-----------|
|   Games   |
|-----------|
|  game_ID  |
|-----------|
|   name    |
|-----------|
|   price   |
|-----------|

我需要将表数据导出为以下xml格式,
<customers>
  <customer>
    <id>1</id>
    <name>value</name>
    <country>value</country>
    <games>
      <game>
        <game_id>1</game_id>
        <name>value</name>
        <price>value</price>
        <download_ver>value</download_ver>
      </game>
      <game>
        <game_id>3</game_id>
        <name>value</name>
        <price>value</price>
        <download_ver>value</download_ver>
      </game>
    </games>
  </customer>

我将在customers表下有多个客户实体。
节点下的列来自由game_id字段链接的下载表。
select XMLELEMENT(name "warehouses",
        XMLAGG(
            XMLELEMENT(name "warehouse",
                XMLFOREST(
                    w.w_id,
                    w.w_name,
                    w.w_country))))
                    FROM warehouse w

上面的代码可以查询仓库节点,但是如何合并游戏节点呢?

最佳答案

demo: db<>fiddle

SELECT
    xmlelement(name customers,
        xmlagg(
            xmlelement(name customer,
                xmlforest(cust_id, name, country, games)
            )
        )
    )
FROM (
    SELECT
        c.cust_id,
        c.name,
        c.country,
        xmlelement(name games,
            xmlagg(
                xmlelement(name game,
                    xmlforest(g.game_id, g.name, price)
                )
            )
        ) as games
    FROM
        customer c
    JOIN
        download d ON (c.cust_id = d.cust_id)
    JOIN
        games g ON (d.game_id = g.game_id)
    GROUP BY c.cust_id, c.name, c.country
    ORDER BY c.cust_id
) s

您需要两个步骤,因为有两个聚合:
在子查询中,我们使用xmlelement将每个客户的游戏聚合为一个xmlagg“游戏”。
在外部查询中,我们将所有客户(及其已聚合的游戏)聚合为一个xmlelement“客户”。

10-07 21:19