【问题标题】:Select from a table as xml grouped by more than one level从一个表中选择一个按多个级别分组的 xml
【发布时间】:2016-07-13 09:46:50
【问题描述】:

我正在使用 DB2 for 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>

上面提到的列都是同一个关系表的一部分。 我发现的所有例子都只有最大值。一个 group by 子句,我不知道如何编写更复杂的查询。有人可以帮忙吗?

【问题讨论】:

  • 您认为发布带有一些示例数据的表结构可能会有所帮助吗?
  • 我们是示例表以及您尝试过的内容以及与预期结果不符的原因。无法从这个问题中看出你想要什么。

标签: xml group-by db2 zos db2-zos


【解决方案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>               

【讨论】:

    猜你喜欢
    • 2014-02-08
    • 2020-05-27
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2018-07-23
    • 1970-01-01
    • 2023-01-23
    相关资源
    最近更新 更多