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的别名的话,这两种情况,语句该写成怎样的呢? 展开
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的别名的话,这两种情况,语句该写成怎样的呢? 展开
1个回答
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)作为一个整体,即使能够作为一个整体,在这里用聚合函数也是错误的。总之就是不行啦。。。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询