Sql 无法绑定多部分标识符,相关子查询
这是一个使用SQLServer2008的人为示例 我实际上是在表的xml列中存储ID列表: temp(bigint id、xml id) 我想将表本身连接到xml节点 到目前为止,我已经:Sql 无法绑定多部分标识符,相关子查询,sql,tsql,sql-server-2008,correlated-subquery,Sql,Tsql,Sql Server 2008,Correlated Subquery,这是一个使用SQLServer2008的人为示例 我实际上是在表的xml列中存储ID列表: temp(bigint id、xml id) 我想将表本身连接到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) )
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>
您正在子查询中选择x.id,也许您应该选择t.id?它是一个派生表,而不是一个相关的子查询。注意,这也不起作用
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
是从中检索行的子查询
数据库。派生_表用作
外部查询的输入
因此,这与where完全不同
子查询依赖于外部查询
查询其值。这意味着
子查询被重复执行,
可能的每行一次
由外部查询选择
要获得预期的输出,根本不需要联接
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)
现在还不清楚你想在这里实现什么。您能发布一些示例数据和所需的输出吗?据我所知,它是一个相关子查询,因为它的值依赖于外部查询。我将表“temp”别名为“x”,并在联接中使用它。@enashnash如果该语法有效,它将是一个相关子查询。但事实并非如此。您需要将其视为先实现了整个z,然后连接到外部查询。(尽管可能会比这更有效率)。如果有帮助的话,也可以将派生表看作一个内联视图。如果整个“z”可以在不引用外部查询的情况下创建,那么它就不会被关联,它只是一个简单的子查询,不是吗?还是我的术语混乱?或者,如果只是我的语法不正确,应该是什么?我已经用样本数据和预期输出更新了问题。根据这些信息,你能提出一个能产生预期输出的查询吗?非常好,谢谢。我很困惑,为什么我原来的语法是无效的;我认为我的预期用途是最初存在的相关子查询的一部分!因为冒着绕圈的风险,您的语法不是一个相关的子查询。这是一个派生表,这些是不同的。谢谢,但不是,这是有意的。好吧,所以我是有意的,但它是错误的:)不过,我已经将答案授予了Martin,因为他为我提供了更完整的答案,并建议了一种更好的启动方法,但感谢您的帮助。
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)
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