为何聚合函数关联的子查询必须添加AS别名子句?
为什么FROM后的子查询必须加别名?
我要在关系型表中查找第五大的ID,写出了下面这段能正常运行的SQL语句:
SELECT MIN(id) FROM ( SELECT TOP 5 id FROM MyTable ORDER BY id DESC ) AS why_do_we_need_this
这是简化示例,实际业务场景更复杂。但我发现去掉最后的AS why_do_we_need_this子句后,语句直接报错无法运行:
SELECT MIN(id) FROM ( SELECT TOP 5 id FROM MyTable ORDER BY id DESC )
另外我还写了SQLite环境下可行的语句:
SELECT MIN(id) FROM MyTable WHERE id IN ( SELECT id FROM MyTable ORDER BY id DESC LIMIT 5 )
核心原因
这是因为SQL标准要求:FROM子句中嵌套的子查询(也就是“派生表”)必须指定别名。数据库需要一个标识符来指代这个临时生成的结果集,哪怕这个别名只是个无意义的占位符(比如你写的why_do_we_need_this),也必须存在。像SQL Server这类支持TOP语法的数据库,严格执行了这个标准,所以不加别名就会触发语法错误。
而你写的SQLite版本之所以不需要别名,是因为那段子查询是作为IN的筛选数据源,不属于FROM子句下的派生表,这类子查询在SQL语法里没有强制别名的要求。
内容的提问来源于stack exchange,提问作者Petter Hesselberg
相关产品推荐
相关产品推荐

