您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么通常无法重用别名的mySQL为什么能够解析这些列别名?

为什么通常无法重用别名的mySQL为什么能够解析这些列别名?

在我看来,这似乎是一个解析错误(在其他数据库中,前两个查询会出现错误)。

我可以猜测发生了什么。MysqL正在解析子查询(selectc1)。它c1在子查询中找不到,因此它开始在外部查询中查找引用。

根据sql的规则,它只能查看from子句中的列。但是,MysqL似乎也在寻找列别名。

尽管我将其称为错误,但MysqL似乎将其视为一项功能。(还有另一个将“错误”视为“功能”的MysqL示例。)考虑以下查询

SELECT CONCAT((SELECT c1), 2), CONCAT(a, b) AS c1
FROM (SELECT 'a' a, 'b' b, 'c' c UNION ALL 
      SELECT '1', '2', '3') t1;

并产生错误

不支持参考“ c1”(项目列表中的前向参考)

错误表明MysqL故意解析“向后”引用。

出于记录,我永远不会依赖此功能。它不仅违反了ANSI标准,而且在数据库中具有独特的行为。令人困惑。考虑一下这个小修改

SELECT CONCAT(a, b) AS c1, CONCAT((SELECT c1), 2)
FROM (SELECT 'a' a, 'b' b, 'c' c UNION ALL 
      SELECT '1', '2', '3') t1 CROSS JOIN
     (SELECT 'abcdef' as c1) x;

这c1的确查询决心?我让你知道。而且这甚至没有考虑到c1可能是一个变量。

MySQL 2022/1/1 18:27:32 有501人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶