这是一个使用SQL Server 2008的人为例子。
我实际上是在表中的xml列中存储id列表: temp(bigint id,xml ids)
我想将表本身连接到xml节点。
到目前为止,我有:
select * from temp x
join (
select x.id
, ids.id.value('@value', 'bigint') zid
from temp t cross apply ids.nodes('/ids/id') as ids(id)
) z on x.id=z.id
我得到:多部分标识符“x.id”无法绑定。
这对我来说就像是一个正常的相关子查询。我错过了什么?
-----更新:
对于临时表中的以下示例数据:
id ids
-- ---
1 <ids><id value="11" /><id value="12" /><id value="13" /></ids>
2 <ids><id value="21" /><id value="22" /><id value="23" /></ids>
3 <ids><id value="31" /><id value="32" /><id value="33" /></ids>
我希望看到以下结果集:
id zid
-- ---
1 11
1 12
1 13
2 21
2 22
2 23
3 31
3 32
3 33
答案 0 :(得分:1)
它是派生表而不是相关子查询。请注意,这也不起作用。
WITH TEMP AS
(
SELECT 1 AS id
)
select x.id
from temp x
join (
select x.id,* from temp t
) z
on x.id = z.id
来自MSDN derived_table
完全不同是从中检索行的子查询 数据库。 derived_table用作 输入到外部查询。
子查询取决于外部 查询其值。这意味着 子查询重复执行, 每行可能一次 由外部查询选择。
要获得预期的输出,您根本不需要JOIN。
WITH TEMP AS
(
select 1 as id, CAST('<ids><id value="11" /><id value="12" /><id value="13" /></ids>' as xml) as ids UNION ALL
select 2, '<ids><id value="21" /><id value="22" /><id value="23" /></ids>' UNION ALL
select 3, '<ids><id value="31" /><id value="32" /><id value="33" /></ids>'
)
select
t.id,
ids.id.value('@value', 'bigint') zid
from temp t cross apply ids.nodes('/ids/id') as ids(id)
如果你决定使用一个,那么despart的回答是正确的。
select x.id, zid from temp x
join (
select
t.id,
ids.id.value('@value', 'bigint') zid
from temp t cross apply ids.nodes('/ids/id') as ids(id)
) z on x.id=z.id
答案 1 :(得分:0)
您正在子查询中选择x.id,也许您应该选择t.id?