Экспорт таблицы SQL как XML - PullRequest
0 голосов
/ 29 октября 2018

У меня есть три таблицы: Клиент, Загрузка, Игры в portgres со следующими полями,

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

Выше кода можно запрашивать узлы хранилища, но как мне включить игровой узел?

1 Ответ

0 голосов
/ 29 октября 2018

демо: дБ <> скрипка

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 «клиентов».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...