我的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
答案 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,结果将为空。