Выберите из таблицы как XML, сгруппированный по нескольким уровням
Я использую DB2 для z/OS V10.
Мне нужно выбрать некоторые данные из таблицы DB2 непосредственно в XML с группировкой данных более чем на 1 уровень, как в следующем примере
<actionCodeGrp>
<actionCode>A</actionCode>
<ISINGrp>
<ISIN>DE0000000001</ISIN>
<NAME>ISIN-DE-1</NAME>
<ISSUER>AAA</ISSUER>
</ISINGrp>
<ISINGrp>
<ISIN>DE0000000002</ISIN>
<NAME>ISIN-DE-2</NAME>
<ISSUER>BBB</ISSUER>
</ISINGrp>
</actionCodeGrp>
<actionCodeGrp>
<actionCode>B</actionCode>
<ISINGrp>
<ISIN>DE0000000003</ISIN>
<NAME>ISIN-DE-3</NAME>
<ISSUER>CCC</ISSUER>
</ISINGrp>
<ISINGrp>
<ISIN>DE0000000004</ISIN>
<NAME>ISIN-DE-4</NAME>
<ISSUER>DDD</ISSUER>
</ISINGrp>
</actionCodeGrp>
Все вышеперечисленные столбцы являются частью одной и той же реляционной таблицы. Все примеры, которые я нашел, были только с макс. одна группа по предложению, и я понятия не имею, как написать более сложный запрос. Может кто-нибудь помочь?
1 ответ
Группировка ваших данных по нескольким уровням в XML-документ, кажется, не слишком хорошо поддерживается, но я заставил это работать, используя вложенные подвыборы:
SELECT XMLSERIALIZE(CONTENT
XMLELEMENT(NAME "FIELD1",
XMLATTRIBUTES(F1),
XMLAGG(SUBELEMENT))
AS CLOB)
FROM(
SELECT F1,
XMLELEMENT(NAME "FIELD2",
XMLATTRIBUTES(F2),
XMLAGG(XMLELEMENT(NAME "FIELD3",
XMLATTRIBUTES(F3))))
AS SUBELEMENT
FROM DBTM42VW.KFZT525
WHERE F1 IN ('VAL1','VAL2')
AND F3 IN('SEF','AUS')
GROUP BY F1, F2) MYSUBQUERY
GROUP BY F1
;
Так что в основном внутренний SELECT
генерирует список необработанных XML-элементов, содержащих внутренние группы плюс столбцы, которые будут использоваться в окружающих элементах. Тогда внешний SELECT
использует эти данные для создания групп из этих групп. Таким образом, результат будет примерно таким:
<FIELD1 F1="VAL1">
<FIELD2 F2="FM124">
<FIELD3 F3="SEF"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="AUS"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="AUS"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="SEF"/>
</FIELD2>
<FIELD2 F2="FM132">
<FIELD3 F3="SEF"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="AUS"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="AUS"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="SEF"/>
</FIELD2>
</FIELD1>
<FIELD1 F1="VAL2">
<FIELD2 F2="FM124">
<FIELD3 F3="SEF"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="AUS"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="SEF"/>
</FIELD2>
<FIELD2 F2="FM132">
<FIELD3 F3="SEF"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="AUS"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="SEF"/>
<FIELD3 F3="AUS"/>
<FIELD3 F3="SEF"/>
</FIELD2>
</FIELD1>