我有下列表格

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

我想把这两张桌子连在一起
select * from A
inner join B on A.TypeId=B.LeftTypeId and {condition}

where条件应验证id leftid将匹配relatedid中的值,其中relatedid是一个xml列。例如relatedID=<Id>1</Id>
有没有一种最佳的方法来做到这一点?
更新
relatedID可以包含多个ID。Eg Eg. relatedID=<Id>1</Id><Id>2</Id>

最佳答案

您可以使用

... 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索引以及它具有哪种类型的索引,上面两个列中的一个可能执行得更好。
UPD。对于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

10-08 04:02