2016-07-13 1 views
0

J'utilise DB2 pour z/OS V10.Sélection d'une table en tant que xml groupée par plusieurs niveaux

J'ai besoin de sélectionner des données d'une table DB2 direcly en XML avec le regroupement des données sur plus de 1 niveau comme l'exemple suivant

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

Les colonnes nommées ci-dessus sont tous partie de la même table relationnelle. Tous les exemples que j'ai trouvés étaient seulement avec max. une clause par groupe et je n'ai aucune idée de comment écrire une requête plus complexe. Quelqu'un peut-il aider?

+0

Pensez-vous que l'affichage de la structure de la table avec des exemples de données pourrait être utile? – mustaccio

+0

nous l'exemple de table et ce que vous avez essayé et comment cela ne correspond pas à votre résultat attendu. Il n'y a aucun moyen de dire ce que vous voulez de cette question. – Hogan

Répondre

0

Pour regrouper vos données sur plusieurs niveaux dans un document XML ne semble pas être trop bien pris en charge, mais je l'ai fait travailler à l'aide des sous-requêtes imbriquées:

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            
;                

Donc, fondamentalement, la SELECT intérieure génère une liste de éléments XML bruts contenant les groupes internes plus les colonnes à utiliser dans les éléments environnants. Ensuite, le SELECT externe utilise ces données pour créer des groupes à partir de ces groupes. Donc, le résultat sera quelque chose comme ceci:

<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

presque que ce que je cherche - merci –