xquery比较2个xml列以获取相同的元素名称

时间:2018-08-07 18:43:32

标签: sql xml sql-server-2012 xquery

我的SQL Server数据库中有2个xml列,它们的结构相同但数据不同。

像这样:

第一列-<root><Person>1</Person><Person>3</Person><Person>6</Person></root>

第二列-<root><Person>2</Person><Person>3</Person><Person>6</Person></root>

如果这两个列之间有任何内部文本值相同,那么我需要按节点名称进行比较。对于上面的示例,它应该返回true,因为人员节点共有3和6。

我尝试使用xquery。我可以将节点与特定值进行比较,而不能与另一列进行比较,例如:

select *
from t
where data.Person.exist('/Person[(text()[1]) eq "3"]') = 1

1 个答案:

答案 0 :(得分:0)

以下查询将首先使用.nodes()获取第一个XML的所有<Person>数字,然后使用corellated子查询获取第二个XML的值作为派生表,可以是{{ 1}}。结果是减少到通用数的集合。您可以按行的ID列对它们进行分组。

INNER JOIN

更新

此查询将使用DECLARE @tbl TABLE (ID INT IDENTITY, Xml1 XML, Xml2 XML); INSERT INTO @tbl VALUES ('<root><Person>1</Person><Person>3</Person><Person>6</Person></root>' ,'<root><Person>2</Person><Person>3</Person><Person>6</Person></root>'); SELECT t1.ID ,p1.value('text()[1]','int') FROM @tbl t1 CROSS APPLY t1.Xml1.nodes('/root/Person') A(p1) INNER JOIN(SELECT p2.value('text()[1]','int') AS p2_Nmbr FROM @tbl t2 WHERE t1.ID=t2.ID CROSS APPLY t2.Xml2.nodes('/root/Person') B(p2)) Tbl_p2 ON p1.value('text()[1]','int')=Tbl_p2.p2_Nmbr; 将两个XML组合为一个。使用这种组合的XML,您可以先运行CROSS APPLY以获得第一个ID的唯一列表,然后检查公共值:

XQuery

如果没有通用ID,结果将为空。