多部件标识符无法绑定,相关子查询

时间:2010-06-28 13:15:12

标签: sql tsql sql-server-2008 correlated-subquery

这是一个使用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

2 个答案:

答案 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用作   输入到外部查询。

所以这与correlated sub query

完全不同
  

子查询取决于外部   查询其值。这意味着   子查询重复执行,   每行可能一次   由外部查询选择。

要获得预期的输出,您根本不需要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?