2013-06-01 29 views
0

我試圖在查詢數據庫時生成以下XML。該數據庫 包含兩個表COUNTRY和美國 -用於生成XML結果的SQL查詢

<Country> 
    <CountryInfo> 
     <name>USA</name> 
     <districts>50</districts> 
     <state> 
      <stateName>New York</stateName> 
      <statePop>8,244,910</statePop> 
     </state> 
     <state> 
      <stateName>Chicago</stateName> 
      <statePop>State Population: 2,707,120</statePop> 
     </state> 
</CountryInfo> 
<CountryInfo> 
     <name>Germany</name> 
     <districts>16</districts> 
     <state> 
      <stateName>Berlin</stateName> 
      <statePop>3,469,910</statePop> 
     </state> 
     <state> 
      <stateName>Brandenburg</stateName> 
      <statePop>2,500,000</statePop> 
     </state> 
    </CountryInfo> 
</Country> 

下面是一個嘗試 -

select ctry.NAME, ctry.DISTRICTS, st.ST_NAME, st.ST_POPULATION 
from COUNTRY ctry inner join STATES st on (ctry.NAME=st.COUNTRY); 

結果是一個平面文件。

<CountryCollection> 
    <COUNTRY> 
    <NAME>USA</NAME> 
    <DISTRICTS>50</DISTRICTS> 
    <ST_NAME>New York</ST_NAME> 
    <ST_POPULATION>8,244,910</ST_POPULATION> 
    </COUNTRY> 
    <COUNTRY> 
    <NAME>USA</NAME> 
    <DISTRICTS>50</DISTRICTS> 
    <ST_NAME>CHICAGO</ST_NAME> 
    <ST_POPULATION> 2,707,120</ST_POPULATION> 
    </COUNTRY> 
    <COUNTRY> 
    <NAME>GERMANY</NAME> 
    <DISTRICTS>16</DISTRICTS> 
    <ST_NAME>Berlin</ST_NAME> 
    <ST_POPULATION>3,469,910</ST_POPULATION> 
    </COUNTRY> 
    <COUNTRY> 
    <NAME>GERMANY</NAME> 
    <DISTRICTS>50</DISTRICTS> 
    <ST_NAME>Brandenburg</ST_NAME> 
    <ST_POPULATION>2,500,000</ST_POPULATION> 
    </COUNTRY> 
</CountryCollection> 

我該如何對它們進行分組以獲得所需的結果?

+0

您使用的是什麼RDBMS? –

+0

RDBMS是Oracle – proximityFlying

回答

1

由於您使用的是Oracle RDBMS,請嘗試此操作。

SELECT XMLElement("Country" 
    , XMLAgg(
    XMLElement("CountryInfo" 
     ,XMLFOREST(CTRY.NAME "name", ctry.DISTRICTS "districts") 
     , xmlAgg(
     XMLElement("state",XMLFOREST(st.ST_NAME "stateName", st.ST_POPULATION "statePop") 
     ) 
    ) 
    ) 
) 
) 
FROM COUNTRY ctry 
INNER JOIN STATES st 
ON (ctry.NAME=st.COUNTRY) 
GROUP BY CTRY.NAME ,ctry.DISTRICTS 

修改爲@ A.B.Cade修正。

+0

它說「表或視圖不存在」。 XMLAgg變得像XMLElement或XMLForest一樣粗體。難道XMLAgg不存在? – proximityFlying

+0

什麼是您的數據庫版本?我使用類似的結構在11gR2上進行了測試。 – Ftaveras

+1

@proximityFlying,xmlagg不是表或視圖,而是一個聚合函數,也許表的名稱不完全相同?因爲查詢的工作原理(只需要group by子句中的',ctry.DISTRICTS')這裏是一個sqlfiddle演示http://www.sqlfiddle.com/#!4/26cd6/3 –