1

我在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>

我将在客户表下有多个客户实体。节点下的列来自由 game_id 字段链接的下载表。

select XMLELEMENT(name "warehouses",
        XMLAGG(
            XMLELEMENT(name "warehouse",
                XMLFOREST(
                    w.w_id,
                    w.w_name,
                    w.w_country))))
                    FROM warehouse w

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

4

1 回答 1

1

演示: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“客户”。

于 2018-10-29T16:16:28.193 回答