一个查询语句多次引用子查询别名报错!

luoxiaobei_ 2017-12-20 03:46:24
SELECT deptno FROM a WHERE a.avg_sal=(SELECT MAX(a.avg_sal) FROM (SELECT deptno,AVG(sal)avg_sal FROM emp GROUP BY deptno)a);

(SELECT deptno,AVG(sal)avg_sal FROM emp GROUP BY deptno)a,我需要两次用到子查询的别名a,但是无论是前面使用别名还是后面使用别名都会报错,说表a不存在。只有两处都写全才能生效,为什么啊?也太不简化了吧?
...全文
479 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2017-12-22
  • 打赏
  • 举报
回复
这样改测测效果 e.g.
SELECT deptno FROM (SELECT deptno,AVG(sal)avg_sal FROM emp GROUP BY deptno) as a  WHERE a.avg_sal=(SELECT AVG(sal) FROM emp GROUP BY deptno order by AVG(sal) desc limit 1);
zjcxc 2017-12-21
  • 打赏
  • 举报
回复
MySQL 只能通过别名引用所定义的子查询的字段,不能通过别名引用整个子查询 所以你确定需要写成最后的那种形式,就算用临时表存储子查询结果也不行,临时表也只能在查询中被引用一次
luoxiaobei_ 2017-12-20
  • 打赏
  • 举报
回复
引用 1 楼 zjcxc 的回复:
你说的两处引用是那两处?两个 a.avg_sal ? 如果是,那么第一个 a.avg_sal 在子查询外面,它无法去子查询里面找东西 这个类似于变量的作用域,里面的可以用外面的,外面的不能用里面的
两处是指: 1:红色的a,这个a要换成(SELECT deptno,AVG(sal)avg_sal FROM emp GROUP BY deptno)a 2:最后的(SELECT deptno,AVG(sal)avg_sal FROM emp GROUP BY deptno)a 也就是写成 SELECT deptno FROM (SELECT deptno,AVG(sal)avg_sal FROM emp GROUP BY deptno)a WHERE a.avg_sal=(SELECT MAX(a.avg_sal) FROM (SELECT deptno,AVG(sal)avg_sal FROM emp GROUP BY deptno)a); 这样才有效。只要不写成这样,无论哪里使用别名a都会报错。
zjcxc 2017-12-20
  • 打赏
  • 举报
回复
你说的两处引用是那两处?两个 a.avg_sal ? 如果是,那么第一个 a.avg_sal 在子查询外面,它无法去子查询里面找东西 这个类似于变量的作用域,里面的可以用外面的,外面的不能用里面的

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧