oracle自带表emp的查询里每个部门最高薪水的员工的信息,如下

selectename,sal,empno,t.deptnofromempjoin(selectmax(sal)max_sal,deptnofromempgroupbyd... select ename, sal, empno, t.deptno
from emp
join (select max(sal) max_sal, deptno from emp group by deptno) t
on (emp.sal = t.max_sal and emp.deptno = t.deptno);

对于字段别名max(sal) max_sal,因为这条子查询已经视为t了,为什么不能写成:
select ename, sal, empno, t.deptno
from emp
join (select max(sal), deptno from emp group by deptno) t
on (emp.sal = t.max(sal) and emp.deptno = t.deptno);
执行报错:

或者不给子查询做别名t,写成:
select ename, sal, empno, emp.deptno
from emp
join (select max(sal) max_sal, deptno from emp group by deptno)
on (emp.sal =
(select max(sal) max_sal, deptno from emp group by deptno)
.max_sal and
emp.deptno =
(select max(sal) max_sal, deptno from emp group by deptno).deptno);

甚至不给字段max(sal)做别名max_sal,直接写成:

为什么都报了这个缺少右括号的错误,如果不引用,上面两种该怎么写呢?
最后一段写错了是:
select ename, sal, empno, emp.deptno
from emp
join (select max(sal), deptno from emp group by deptno)
on (emp.sal =
(select max(sal), deptno from emp group by deptno)
.max(sal) and
emp.deptno =
(select max(sal), deptno from emp group by deptno).deptno);

如果不用字段max(sal)的别名、不用表select max(sal), deptno from emp group by deptno的别名的话,这两种情况,语句该写成怎样的呢?
展开
 我来答
匿名用户
2015-08-18
展开全部

为什么题主要有意避免使用别名呢?

oracle的别名有些可以使用表名代替,有些必须要使用别名,题主有些过于较真了。

题主可以换一个写法,效率比这个好些:

select *
  from (select ename,
               sal,
               max(sal) over(partition by deptno) max_sal,
               empno,
               deptno
          from emp)
 where sal = max_sal
更多追问追答
追问
比如max_sal的别名也是必须的?
追答
是的,因为你引用的不是一个字段而是一个函数, t.max(sal),这样它会先找t.max而不会把max(sal)作为一个整体,即使能够作为一个整体,在这里用聚合函数也是错误的。总之就是不行啦。。。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式