postgreSQL:创建XML时的排序

时间:2015-09-13 19:06:18

标签: xml postgresql

我很难写出我的查询来输出一些XML。

我得到了一张包含几个条目的表格:

表dokumentationsschritte(简化)

dokuschritt_id,vorgang_id,version_pool,version_lokal,典型值,vorgang_nummer

我的查询:

SELECT XMLFOREST(tb1."xml-val" AS "dokumentationsschritte") 
FROM 
(SELECT XMLAGG(XMLELEMENT(NAME dokumentationsschritt ,XMLATTRIBUTES(t.dokuschritt_id AS dokuschritt_id,t.vorgang_id AS vorgang_id,t.version_pool AS version_pool,t.version_lokal AS version_lokal,t.deprecated AS deprecated),
XMLELEMENT(NAME typ,t.typ),XMLELEMENT(NAME dokuschritt_nummer,t.dokuschritt_nummer))) AS  "xml-val" 
FROM dokumentationsschritte t WHERE t.vorgang_id='4930c02e-1457-316c-c11f-9b7d7f1acb85') AS tb1;

这是有效的,因为我将所有条目都作为XML:

<dokumentationsschritte>
  <dokumentationsschritt dokuschritt_id="88942eb7-fbeb-3740-a1b5-a188b0029791" vorgang_id="4930c02e-1457-316c-c11f-9b7d7f1acb85" version_pool="0" version_lokal="3" deprecated="0">
    <typ>1</typ>
    <dokuschritt_nummer>1204</dokuschritt_nummer>
  </dokumentationsschritt>
  <dokumentationsschritt dokuschritt_id="94bdeccf-2c89-3163-bd10-6f4353c8b575" vorgang_id="4930c02e-1457-316c-c11f-9b7d7f1acb85" version_pool="0" version_lokal="3" deprecated="0">
    <typ>1</typ>
    <dokuschritt_nummer>755</dokuschritt_nummer>
  </dokumentationsschritt>
</dokumentationsschritte>

但我想订购dokuschritt_nummer

一旦我添加了ORDER BY,就会出错,要求提供GROUP BY,但是如果我添加它,那么XML就会被搞砸......不再有根节点,而是每个条目都有一个dokumentationsschritte节点。

[编辑]

SELECT XMLFOREST(tb1."xml-val" AS "dokumentationsschritte") 
FROM 
(SELECT XMLAGG(XMLELEMENT(NAME dokumentationsschritt ,XMLATTRIBUTES(t.dokuschritt_id AS dokuschritt_id,t.vorgang_id AS vorgang_id,t.version_pool AS version_pool,t.version_lokal AS version_lokal,t.deprecated AS deprecated),
XMLELEMENT(NAME typ,t.typ),XMLELEMENT(NAME dokuschritt_nummer,t.dokuschritt_nummer GROUP BY dokuschritt_nummer ORDER BY dokuschritt_nummer))) AS  "xml-val" 
FROM dokumentationsschritte t WHERE t.vorgang_id='4930c02e-1457-316c-c11f-9b7d7f1acb85') AS tb1;

[/编辑]

 <dokumentationsschritte><dokumentationsschritt dokuschritt_id="4b57c57a-0330-3dc7-8eed-f1b0192c6372" vorgang_id="4930c02e-1457-316c-c11f-9b7d7f1acb85" version_pool="0" version_lokal="2" deprecated="0"><typ>2</typ><dokuschritt_nummer>1</dokuschritt_nummer></dokumentationsschritt></dokumentationsschritte>
    <dokumentationsschritte><dokumentationsschritt dokuschritt_id="966136b2-5fc3-306c-88db-064e4d17f710" vorgang_id="4930c02e-1457-316c-c11f-9b7d7f1acb85" version_pool="0" version_lokal="1" deprecated="0"><typ>1</typ><dokuschritt_nummer>2</dokuschritt_nummer></dokumentationsschritt></dokumentationsschritte>

我很丢失。你能帮忙吗?

非常感谢!

马尔特

1 个答案:

答案 0 :(得分:0)

这应该有效,如果你想要对聚合函数中的数据进行排序,你必须将ORDER BY置于agg([ref])内。

SELECT XMLFOREST(tb1."xml-val" AS "dokumentationsschritte") 
FROM 
(SELECT XMLAGG(
               XMLELEMENT(NAME dokumentationsschritt 
                          ,XMLATTRIBUTES(t.dokuschritt_id AS dokuschritt_id,t.vorgang_id AS vorgang_id,t.version_pool AS version_pool,t.version_lokal AS version_lokal,t.deprecated AS deprecated)
                          ,XMLELEMENT(NAME typ,t.typ)
                          ,XMLELEMENT(NAME dokuschritt_nummer,t.dokuschritt_nummer)                          
                          )      
              ORDER BY dokuschritt_nummer        
              ) AS  "xml-val" 
FROM 
dokumentationsschritte t
WHERE t.vorgang_id='4930c02e-1457-316c-c11f-9b7d7f1acb85') AS tb1;