首页 > 解决方案 > 删除重复的 XML 节点 SQL 查询

问题描述

我有以下 XML。

<Root>
  <Child1>
    <SubChild1>some value</PartNumber>
  </Child1>
  <Child2>some data</Child2>
  <Child3>some data</Child3>
  <Child4>some data</Child4>
  <Child2>some data</Child2>
  <Child3>some data</Child3>
  <Child5>some data</Child5>
</Root>

我想删除重复的节点并以以下格式返回 XML。

<Root>
  <Child1>
    <SubChild1>some value</PartNumber>
  </Child1>
  <Child2>some data</Child2>
  <Child3>some data</Child3>
  <Child4>some data</Child4>
  <Child5>some data</Child5>
</Root>

我尝试了下面的 SQL 查询,但它没有用。

SELECT @myXMLData.query('
    for $x in distinct-values(//*)[1]
        return
            (//*)[1]
')

我也尝试过distinct-values,但它返回值(不包含节点属性)。

SELECT @XML.query('<Root>{ distinct-values(//*) }</Root>')

请问有什么帮助吗?

标签: sqlsql-serverxmlxpathxml-parsing

解决方案


declare @x xml = N'<Root>
  <Child1>
    <SubChild1>some value</SubChild1>
  </Child1>
  <Child2>some data</Child2>
  <Child3>some data</Child3>
  <Child4>some data</Child4>
  <Child2>some data</Child2>
  <Child3>some data</Child3>
  <Child5>some data</Child5>
</Root>';

select node as '*'
from
(
select x.e.query('.') as node, row_number() over(partition by x.e.value('local-name(.)', 'nvarchar(100)') order by x.e) as nodenum
from @x.nodes('Root/*') as x(e)
) as src
where nodenum = 1
for xml path(''), root('Root');

推荐阅读