我在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
上面的代码可以查询仓库节点,但是如何合并游戏节点呢?
最佳答案
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
“客户”。