以XML格式显示层次结构

时间:2018-03-13 14:44:03

标签: sql xml oracle hierarchical-data

我有下表:

员工(id int,名称varchar,managerid int)

   ID   NAME   MANAGERID
    1    A       2
    2    B       4
    3    C       4
    4    D      NULL

期望输出:

<Node name="D" id="4">
   <Node name="B" id="2">
    <Node name="A" id="1">
    </Node>
   </Node>  
  <Node name="C" id="3">
  </Node>
</Node>

现在,我知道这只是深度优先搜索所以我已经完成了以下操作:

WITH t1(id,name,managerid) AS (
  -- Anchor member.
  SELECT id,
         name,
         managerid
  FROM   employee
    WHERE  managerid IS NULL
  UNION ALL
  -- Recursive member.
  SELECT t2.id,
         t2.name,
         t2.managerid
  FROM   employee t2, t1
  WHERE  t2.managerid = t1.id
)
SEARCH DEPTH FIRST BY id SET order1
SELECT id,
       name,
       managerid
FROM   t1
ORDER BY order1\\

以上查询的输出是:

   ID  NAME MANAGERID
    4   D    NULL
    2   B    4
    1   A    2
    3   C    4

现在,我不知道如何将此输出转换为之前显示的xml版本。

我知道有XMLElementXMLAGG等功能,但我不知道如何在这种分层查询中使用它。

注意:目前,我在 Oracle 中这样做,但如果另一个RDBMS有更简单的方法来解决这个问题,那么我就是为了它。

2 个答案:

答案 0 :(得分:2)

您可以使用dbms_xmlgen.newcontextFromHierarchy执行此操作,如下所示:

select dbms_xmlgen.getxmltype(dbms_xmlgen.newcontextFromHierarchy('
WITH sample_data AS (SELECT 1 ID, ''A'' NAME, 2 managerid FROM dual UNION ALL
                     SELECT 2 ID, ''B'' NAME, 4 managerid FROM dual UNION ALL
                     SELECT 3 ID, ''C'' NAME, 4 managerid FROM dual UNION ALL
                     SELECT 4 ID, ''D'' NAME, NULL FROM dual)
select level 
       , xmlelement("node" 
       , XMLAttributes(name as "name",
                       id as "id")
       ) 
FROM   sample_data
CONNECT BY PRIOR ID = managerid
START WITH managerid IS NULL
  ')) from dual;

返回:

<?xml version="1.0"?>
<node name="D" id="4">
  <node name="B" id="2">
    <node name="A" id="1"/>
  </node>
  <node name="C" id="3"/>
</node>

您需要将dbms_xmlgen.newcontextFromHierarchy()调用中的查询替换为您的实际查询。

答案 1 :(得分:1)

如果您模拟jdbc:teradata://***.***.***.***/tmode=ANSI,charset=UTF8的{​​{1}}列,则可以使用DBMS_XMLGEN.newcontextfromhierarchy和CTE完成此操作:

level

<强>输出

connect by