我正在使用 DB2 for z/OS V10。
我需要从 DB2 表中直接选择一些数据到 XML 中,并将数据分组到一个以上的级别,如以下示例所示
<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>
上面命名的列都是同一关系表的一部分。我找到的所有示例最多只有一个 group by 子句,我不知道如何编写更复杂的查询。有人可以帮忙吗?
将多个级别的数据分组到 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>