#xml #postgresql
#xml #postgresql
Вопрос:
Привет, я пытаюсь преобразовать данные Postgre SQL в формат XML, используя следующее:
copy(
select xmlroot
(
xmlelement
(
name "warehouses",
xmlagg
(
xmlelement
(
name "warehouse",
xmlelement(name "id",warehouse.w_id),
xmlelement(name "name",warehouse.w_name),
xmlelement
(
name "address",
xmlelement(name "street",warehouse.w_street),
xmlelement(name "city",warehouse.w_city),
xmlelement(name "country",warehouse.w_country)
),
xmlelement
(
name "items",
xmlagg(
xmlelement
(
name "item",
xmlelement(name "id",item.i_id),
xmlelement(name "im_id",item.i_im_id),
xmlelement(name "name",item.i_name),
xmlelement(name "price",item.i_price),
xmlelement(name "qty",stock.s_qty)
))
)
)
)
), version '1.0" encoding = "utf-8'
) from warehouse inner join stock on warehouse.w_id = stock.w_id
inner join item on stock.i_id = item.i_id
) to '/home/cs4221/Desktop/test.xml'
Но показывает сообщение об ошибке:
«вызов агрегатных функций не может быть вложенным»
И указать на мою вторую функцию xmlagg.
Почему xmlagg не может быть вызван вложенным?
Без второго xmlagg вывод выглядит следующим образом:
<warehouses>
<warehouse>
<id>22</id>
<name>Namekagon</name>
<address>
<street>Anniversary</street>
<city>Singapore</city>
<country>Singapore</country>
</address>
<items>
<item>
<id>4</id>
<im_id>54868007</im_id>
<name>MECLIZINE HYDROCHLORIDE</name>
<price>54.49</price>
<qty>597</qty>
</item>
</items>
</warehouse>
<warehouse>
<id>22</id>
<name>Namekagon</name>
<address>
<street>Anniversary</street>
<city>Singapore</city>
<country>Singapore</country>
</address>
<items>
<item>
<id>5</id>
<im_id>24658312</im_id>
<name>Doxycycline Hyclate</name>
<price>28.99</price>
<qty>477</qty>
</item>
</items>
</warehouse>
Идентификатор хранилища 22 содержит два элемента 4 и 5. Я хочу объединить их в один раздел.
Комментарии:
1. Можете ли вы привести нам пример, как должен выглядеть результат?
Ответ №1:
Для каждого выбранного параметра может быть только один xmlagg. Чтобы обойти это, вы можете использовать подвыборку в xmlelement и использовать там xmlagg следующего уровня.
Просто удалите соединение в и запроса и используйте что-то вроде:
xmlelement
(
name "items",
(
select xmlagg
(
xmlelement
(
name "item",
xmlelement(name "id",item.i_id),
xmlelement(name "im_id",item.i_im_id),
xmlelement(name "name",item.i_name),
xmlelement(name "price",item.i_price),
xmlelement(name "qty",stock.s_qty)
)
)
)
)
from stock where warehouse.w_id = stock.w_id
join item on stock.i_id = item.i_id)
Ответ №2:
<warehouses>
<warehouse>
<id>22</id>
<name>Namekagon</name>
<address>
<street>Anniversary</street>
<city>Singapore</city>
<country>Singapore</country>
</address>
<items>
<item>
<id>4</id>
<im_id>54868007</im_id>
<name>MECLIZINE HYDROCHLORIDE</name>
<price>54.49</price>
<qty>597</qty>
</item>
</items>
</warehouse>
<warehouse>
<id>22</id>
<name>Namekagon</name>
<address>
<street>Anniversary</street>
<city>Singapore</city>
<country>Singapore</country>
</address>
<items>
<item>
<id>5</id>
<im_id>24658312</im_id>
<name>Doxycycline Hyclate</name>
<price>28.99</price>
<qty>477</qty>
</item>
</items>
</warehouse>
Комментарии:
1. идентификатор хранилища 22 содержит два элемента 4 и 5. я хочу объединить их в один раздел. я использовал xmlagg, но получил сообщение об ошибке: «вызов агрегатных функций не может быть вложенным» (приведенный выше вывод получен путем удаления второй функции xmlagg)