1

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

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

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

感谢帮助。

4

2 回答 2

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

于 2013-10-21T06:27:26.823 回答
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
于 2013-10-20T18:34:49.463 回答