为什么嵌套选择引用外部范围不是语法错误

问题描述 投票:0回答:1
评论这两行后,检索到的行数不会改变,导致我怀疑它没有做任何事情。 但是,我仍然不明白为什么如果将它们留在语法上,这不是语法错误。

在SQL子查询中,您可以参考上级查询的表和列。示例:

select * from a where (select count(*) from b where b.ida = a.id) > 2;

sql sql-server
1个回答
0
投票

select a.*, (select count(*) from b where b.ida = a.id) as cnt from a;

您不能做什么 - 这可能是使您感到困惑的 - 是在传统派生表中的一个从子句(子查询)中引用一个从句:

select * from a cross join (select count(*) as cnt from b where b.ida = a.id) x;

这是因为DBM可以自由按任何顺序执行表,因此在评估派生表X时可能尚不知道表A。如果要在派生表中访问TABKE,它一定不能是常规的连接,而是横向连接,该连接力在派生表x之前评估表A。
select * from a cross join lateral (select count(*) as cnt from b where b.ida = a.id) x;


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.