验证xml节点是否具有给定值sql的子节点

时间:2014-07-29 16:32:33

标签: sql-server xml database tsql

我有以下表格

A (ID, relatedID, typeId )
B (ID, leftID, leftTypeId)

我想加入像这样的两个表

select * from A
inner join B on A.TypeId=B.LeftTypeId and {condition}

其中条件应验证ID leftID 是否与 relatedID 中的值匹配,其中relatedId是xml列。例如。 relatedID = <Id>1</Id>

有最佳方法吗?

更新 relatedID可以包含多个ID。例如,例如。 relatedID=<Id>1</Id><Id>2</Id>

1 个答案:

答案 0 :(得分:2)

您可以使用

... and A.relatedID.value('(/Id[1]/text())[1]', 'int') = B.leftID

... and A.relatedID.exist('(/Id[1]/text())[1] = sql:column("B.leftID")') = 1

虽然建议使用exist而不是value作为谓词,但取决于XML列是否为xml-indexed以及它具有哪种类型的索引,上述两个中的一个可能表现更好。

更新。,当relatedID可以包含您可以尝试的一组ID时

select ...
from A
    cross apply A.relatedID.nodes('/Id') r(id)
    inner join B on A.TypeId=B.LeftTypeId
        and r.id.value('text()[1]', 'int') = B.leftID

select ...
from A
    cross apply A.relatedID.nodes('/Id') r(id)
    inner join B on A.TypeId=B.LeftTypeId
        and r.id.exist('text()[1]=sql:column("B.leftID")') = 1

甚至

select ...
from A
    inner join B on A.TypeId=B.LeftTypeId
        and A.relatedID.exist('/Id[text()[1]=sql:column("B.leftID")]') = 1