Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 无法绑定多部分标识符,相关子查询_Sql_Tsql_Sql Server 2008_Correlated Subquery - Fatal编程技术网

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

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) )

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