练习一些SQL,我们必须得到薪水最高的员工的名字。但是,如果在任何一个部门都有不止一个薪水最高的雇主,我们就不必考虑那个部门。
我们获得了第一部分而不是第二部分(因为在同一部门中有两名雇员具有相同的最高薪水(3,000))。
这就是我们所做的:
SQL> SELECT ename, sal, deptno FROM emp a
WHERE sal >= ALL (SELECT sal FROM emp WHERE deptno=a.deptno)
ORDER BY sal;
这就是我们得到的:
ENAME SAL DEPTNO
---------- ------- ------
BLAKE 2,850 30
FORD 3,000 20
SCOTT 3,000 20
KING 5,000 10
4 filas seleccionadas.
任何帮助都会有用,谢谢!
答案 0 :(得分:0)
with cte as
( SELECT ename, sal, deptno
, row_number() over (partition by deptno order by sal desc) as rn
FROM emp
)
select ename, sal, deptno from cte where rn = 1
except
select ename, sal, deptno from cte where rn = 2
order by sal
如果这在oracle中不起作用 - 它曾经也被标记为mssql
答案 1 :(得分:0)
您可以通过某些analytic functions获得所需内容:
select ename,
deptno,
sal
from (
select ename,
deptno,
sal,
row_number() over(partition by deptno order by sal desc) AS num,
count(1) over(partition by deptno, sal) AS count
from emp
)
where num = 1
and count = 1
内部查询按工资排序,并计算同一部门中具有相同薪水的员工人数;外部人员只需为具有最高工资的员工过滤,其中只有一名员工在该部门拥有该薪水。
使用不同的方法,只需修改您的查询,您可以尝试:
SELECT ename, sal, deptno FROM emp a
WHERE sal >= ALL (SELECT sal FROM emp WHERE deptno=a.deptno)
and (select count(1) from emp b where a.deptno = b.deptno and a.sal = b.sal) = 1
第一种方式通过单个表扫描提供更好的性能,而第二种方式需要嵌套查询,因此效率较低
答案 2 :(得分:0)
SELECT ename, sal, deptno
FROM emp a
WHERE not exists (
SELECT *
FROM emp
WHERE deptno=a.deptno
and sal >= a.sal
and ename != a.ename)
ORDER BY sal;
答案 3 :(得分:-5)
尝试使用GROUP BY
column_name`,它会显示没有重复的记录。