我有一个包含一列的表格:
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子句。
感谢您的帮助。
答案 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