【问题标题】:Multipart identifer could not be bound, correlated subquery多部分标识符无法绑定,相关子查询
【发布时间】:2010-06-28 13:15:11
【问题描述】:

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

【问题讨论】:

  • 尚不清楚您要在这里实现什么。您能否发布一些示例数据和所需的输出?

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


【解决方案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

是一个子查询,从 数据库。派生表用作 外部查询的输入。

所以这与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)

如果您确实决定使用一个,那么 depart 的答案是正确的。

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

【讨论】:

  • 据我所知,它是一个相关的子查询,正是因为它的值依赖于外部查询。我将表“temp”别名为“x”并在连接中使用它。
  • @enashnash 如果该语法有效,它将是一个相关的子查询。但事实并非如此。您需要将其视为首先实现整个 z 然后加入外部查询。 (尽管它可能会比这更有效)。或者,如果有帮助,可以将派生表视为内联视图。
  • 如果整个 'z' 可以在不引用外部查询的情况下创建,那么它不会被关联,它只是一个简单的子查询,不是吗?还是我的术语混淆了?或者,如果只是我的语法不正确,那应该是什么?我已经用示例数据和预期输出更新了问题。鉴于这些信息,您能否建议一个能产生预期输出的查询?
  • 太好了,谢谢。我对为什么我的原始语法无效感到困惑;我认为我的预期用途是首先存在的相关子查询的一部分!
  • 因为冒着兜圈子的风险,您的语法不是相关子查询。这是一个派生表,它们是不同的msdn.microsoft.com/en-us/library/ms177634.aspx
【解决方案2】:

您在子查询中选择 x.id,也许您应该选择 t.id?

【讨论】:

  • 谢谢,但不,这是故意的。
  • 好的,我是故意的,但这是错误的 :) 我已经将答案授予了 Martin,因为他为我提供了更完整的答案并建议了更好的启动方法,但是谢谢为您提供帮助。
猜你喜欢
  • 2013-01-17
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
相关资源
最近更新 更多