0

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>

上記の列はすべて、同じリレーショナル テーブルの一部です。私が見つけたすべての例は、最大のみでした。1 つの group by 句で、より複雑なクエリを作成する方法がわかりません。誰か助けてくれませんか?

4

1 に答える 1

0

データを複数のレベルで 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>               
于 2016-07-14T08:50:20.460 に答える