特定XML的Oracle SQL层次结构

特定XML的Oracle SQL层次结构,sql,xml,oracle,hierarchy,Sql,Xml,Oracle,Hierarchy,我正在寻找一个可以将层次结构表转换为XML格式的查询。现在我一直在网上寻找几种解决方案,但似乎无法获得正确的输出 我所拥有的是: INSERT INTO "NODES" (ID, NAME) VALUES (1, 'test parent'); INSERT INTO "NODES" (ID, PARENTID, NAME) VALUES (2,1,'test child 1'); INSERT INTO "NODES" (ID, PARENTID, NAME) VALUES (3,1,'tes

我正在寻找一个可以将层次结构表转换为XML格式的查询。现在我一直在网上寻找几种解决方案,但似乎无法获得正确的输出

我所拥有的是:

INSERT INTO "NODES" (ID, NAME) VALUES (1, 'test parent');
INSERT INTO "NODES" (ID, PARENTID, NAME) VALUES (2,1,'test child 1');
INSERT INTO "NODES" (ID, PARENTID, NAME) VALUES (3,1,'test child 2');
INSERT INTO "NODES" (ID, PARENTID, NAME) VALUES (4,3,'test child 3');
<ns:nodes xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
    <ns1:node>
        <ns2:name>test parent</name>
        <!-- extra info -->
        <nodes>
            <node>
                <name>test child 1</name>
                <!-- extra info and child nodes -->
            </node>
            <node>
                <name>test child 2</name>
                <nodes>
                    <node>
                        <name>test child 3</name>
                        <!-- extra info and child nodes -->
                    </node>
                </nodes>
            </node>
        </nodes>
    </node>
</nodes>
<nodes>
  <ns1:node xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
    <ns2:name>test parent</ns2:name>
  </ns1:node>
  <nodes>
    <ns1:node xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
      <ns2:name>test child 1</ns2:name>
    </ns1:node>
  </nodes>
  <nodes>
    <ns1:node xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
      <ns2:name>test child 2</ns2:name>
    </ns1:node>
    <nodes>
      <ns1:node xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
        <ns2:name>test child 3</ns2:name>
      </ns1:node>
    </nodes>
  </nodes>
</nodes>
现在我想得到以下信息:

INSERT INTO "NODES" (ID, NAME) VALUES (1, 'test parent');
INSERT INTO "NODES" (ID, PARENTID, NAME) VALUES (2,1,'test child 1');
INSERT INTO "NODES" (ID, PARENTID, NAME) VALUES (3,1,'test child 2');
INSERT INTO "NODES" (ID, PARENTID, NAME) VALUES (4,3,'test child 3');
<ns:nodes xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
    <ns1:node>
        <ns2:name>test parent</name>
        <!-- extra info -->
        <nodes>
            <node>
                <name>test child 1</name>
                <!-- extra info and child nodes -->
            </node>
            <node>
                <name>test child 2</name>
                <nodes>
                    <node>
                        <name>test child 3</name>
                        <!-- extra info and child nodes -->
                    </node>
                </nodes>
            </node>
        </nodes>
    </node>
</nodes>
<nodes>
  <ns1:node xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
    <ns2:name>test parent</ns2:name>
  </ns1:node>
  <nodes>
    <ns1:node xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
      <ns2:name>test child 1</ns2:name>
    </ns1:node>
  </nodes>
  <nodes>
    <ns1:node xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
      <ns2:name>test child 2</ns2:name>
    </ns1:node>
    <nodes>
      <ns1:node xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
        <ns2:name>test child 3</ns2:name>
      </ns1:node>
    </nodes>
  </nodes>
</nodes>
但这会产生以下结果:

INSERT INTO "NODES" (ID, NAME) VALUES (1, 'test parent');
INSERT INTO "NODES" (ID, PARENTID, NAME) VALUES (2,1,'test child 1');
INSERT INTO "NODES" (ID, PARENTID, NAME) VALUES (3,1,'test child 2');
INSERT INTO "NODES" (ID, PARENTID, NAME) VALUES (4,3,'test child 3');
<ns:nodes xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
    <ns1:node>
        <ns2:name>test parent</name>
        <!-- extra info -->
        <nodes>
            <node>
                <name>test child 1</name>
                <!-- extra info and child nodes -->
            </node>
            <node>
                <name>test child 2</name>
                <nodes>
                    <node>
                        <name>test child 3</name>
                        <!-- extra info and child nodes -->
                    </node>
                </nodes>
            </node>
        </nodes>
    </node>
</nodes>
<nodes>
  <ns1:node xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
    <ns2:name>test parent</ns2:name>
  </ns1:node>
  <nodes>
    <ns1:node xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
      <ns2:name>test child 1</ns2:name>
    </ns1:node>
  </nodes>
  <nodes>
    <ns1:node xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
      <ns2:name>test child 2</ns2:name>
    </ns1:node>
    <nodes>
      <ns1:node xmlns:ns="test" xmlns:ns1="test1" xmlns:ns2="test2">
        <ns2:name>test child 3</ns2:name>
      </ns1:node>
    </nodes>
  </nodes>
</nodes>

测试父母
测试儿童1
测试儿童2
测试儿童3
但是正如您所看到的,nodes元素不在父节点内。此外,还会为每个节点生成nodes元素,并且没有分组。在Oracle SQL中有没有一种简单的方法可以做到这一点

我正在使用Oracle DB 12.2.0.1


提前感谢。

您的示例数据有两个ID为3的节点,看起来不正确,并且列名应该是
code
而不是
name
,我想?在您的预期输出中,应该
测试子3
的位置;层次结构中的级别数量是否有限制?另外,您使用的是哪一版本的Oracle?结构没有技术限制。虽然我们将在业务层面上对此进行限制,但我们不希望在代码中对其进行限制,因为这可能会根据消费者的需要而改变。同样抱歉,我并没有实际测试这些查询,这个示例实际上是我实际查询的一个示例和缩小版本,我使用代码而不是名称。我会改正的。”“测试子项3”应为“测试子项1”的子项。我添加这个是为了明确根的子级也可以有子级(但忘记更改ID)。哦,我正在使用Oracle DB 12.2.0.1来执行此操作。您的示例输出不包含“test child 3”,并且“test child 2”的位置看起来不符合逻辑。抱歉,我键入了错误的名称。基本上你有一个元素,里面列出了所有的子元素。每个节点都可以包含按元素分组的子节点。我已经纠正了所有的错误并进行了测试。所以现在一切都应该是正确的。