2016-07-13 27 views
0

Ich verwende DB2 für z/OS V10.Wählen Sie eine Tabelle als XML aus, die nach mehr als einer Ebene gruppiert ist.

Ich brauche einige Daten aus einer DB2-Tabelle mit Gruppierung der Daten auf mehr als 1 Ebene wie das folgende Beispiel

<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> 

Die Spalten direcly in XML wählen oben sind alle Teile der gleichen relationalen Tabelle mit dem Namen. Alle Beispiele, die ich gefunden habe, waren nur mit max. eine Gruppierung nach Klausel und ich habe keine Ahnung, wie man eine komplexere Abfrage schreibt. Kann jemand helfen?

+0

Denkst du, die Tabelle Struktur mit einigen Beispieldaten Beitrag könnte hilfreich sein? – mustaccio

+0

wir die Beispieltabelle und was Sie versucht haben und wie das nicht zu Ihrem erwarteten Ergebnis gepasst hat. Es gibt keine Möglichkeit zu sagen, was Sie von dieser Frage wollen. – Hogan

Antwort

0

So gruppieren Sie Ihre Daten über mehrere Ebenen in ein XML-Dokument scheint nicht allzu gut unterstützt zu werden, aber ich habe es verschachtelte Subselects mit arbeiten:

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            
;                

Also im Grunde die innere SELECT eine Liste erzeugt rohe XML-Elemente, die die inneren Gruppen plus die Spalten enthalten, die in den umgebenden Elementen verwendet werden sollen. Dann verwendet das äußere SELECT diese Daten, um Gruppen aus diesen Gruppen zu erstellen. So wird das Ergebnis in etwa so aussehen:

<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>    
+0

fast das, was ich suche - thx –