特定XML的Oracle SQL层次结构
我正在寻找一个可以将层次结构表转换为XML格式的查询。现在我一直在网上寻找几种解决方案,但似乎无法获得正确的输出 我所拥有的是:特定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
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”的位置看起来不符合逻辑。抱歉,我键入了错误的名称。基本上你有一个元素,里面列出了所有的子元素。每个节点都可以包含按元素分组的子节点。我已经纠正了所有的错误并进行了测试。所以现在一切都应该是正确的。