在xml.exist()中编写子查询

时间:2013-10-20 18:10:40

标签: sql sql-server xml sqlxml

我有一个包含一列的表格:

IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp
CREATE TABLE #tmp
(
data XML
)GO

有一条记录:

INSERT INTO #tmp
VALUES ( N'<RelevanExpertXML><Tel><RelevanExpert>1</RelevanExpert></Tel><Tel><RelevanExpert>2</RelevanExpert></Tel></RelevanExpertXML>')

另一个有一栏的故事

CREATE TABLE #tmp2
(
id int
)
GO

我想写这个查询:

select * 
from #temp
where xml.exist('/RelevanExpertXML/Tel/RelevanExpert[(text()) = [select id from     #temp2]]') = 1

实际上我想在exists()中编写子查询,但是我得到错误,而且我也无法从子句和选择列表中更改,只有我可以更改where子句。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用此查询:

select * 
from #tmp
where exists
    (
       select * 
       from #tmp2 as t
       where
           #tmp.data.exist('/RelevanExpertXML/Tel/RelevanExpert[(text()) = sql:column("t.id")]') = 1
    )

但它将返回整个xml。如果要按行拆分xml,则必须在nodes()子句中使用from函数。

答案 1 :(得分:0)

你可以写

select * 
from #tmp, #temp2
where data.exist('/RelevanExpertXML/Tel/RelevanExpert[text()] = sql:column("id")')=1

但我认为它不会给你你想要的结果。

你可能会更喜欢

select t.r.value('.','int')
from #tmp temp
cross apply data.nodes('/RelevanExpertXML/Tel/RelevanExpert') t(r)
inner join #temp2 t2 on t.r.value('.','int') = t2.id