MySQL报错#1054:已定义别名仍提示ON子句未知列request1.orgname
错误原因
你遇到的Unknown column 'request1.orgname' in 'on clause'错误,根源是子查询的列别名设置问题:
- 你在
request1子查询内部,将api_key.orgname字段重命名为了Organization,子查询最终输出的结果集中不存在名为orgname的列 - JOIN关联的ON条件只能引用子查询最终返回的列名,不能直接引用子查询内部源表的原始列名,因此引用
request1.orgname会触发未知列错误。
另外你的SQL还存在一个隐性问题:使用了SUM()聚合函数但未添加GROUP BY子句,在MySQL开启ONLY_FULL_GROUP_BY模式时会直接报错,即使在非严格模式下运行,返回的聚合结果也会不符合预期。
修复方案
你可以任选以下一种方式修改:
方案1(推荐):子查询保留关联键的原始列名
将子查询中api_key.orgname AS 'Organization'的别名去掉,保留原列名orgname,同时补充缺失的GROUP BY子句,修改后的完整SQL如下:
SELECT request.orgname, request1.API_name AS 'API name', SUM(CASE WHEN request.username IS NULL THEN request.projects_priced_count else 0 END) AS 'API prices calls', SUM(request.projects_priced_count) AS 'Total prices calls' FROM prod_virida_pricing.request LEFT OUTER JOIN ( SELECT api_key.name AS 'API_name', api_key.orgname, date(expiry_date) AS 'API expiry date', is_active AS 'Active org' FROM prod_virida_auth.api_key INNER JOIN prod_virida_auth.organization ON api_key.orgname = organization.orgname WHERE api_key.blocked = 0 AND organization.is_active = 1) request1 ON request.orgname = request1.orgname GROUP BY request.orgname, request1.API_name ORDER BY orgname;
方案2:修改ON条件匹配子查询的列别名
如果你确实需要在子查询中将orgname字段命名为Organization,只需要把ON条件里的关联列改成对应别名即可,注意带特殊字符/空格的别名需要用反引号包裹:
-- 仅需修改JOIN部分的ON条件 LEFT OUTER JOIN ( SELECT api_key.name AS 'API_name', api_key.orgname AS 'Organization', date(expiry_date) AS 'API expiry date', is_active AS 'Active org' FROM prod_virida_auth.api_key INNER JOIN prod_virida_auth.organization ON api_key.orgname = organization.orgname WHERE api_key.blocked = 0 AND organization.is_active = 1) request1 ON request.orgname = request1.`Organization`
记得同样要补充对应的GROUP BY子句。
内容的提问来源于stack exchange,提问作者Antoine G
相关产品推荐
相关产品推荐

