SQL选择没有重复的行

时间:2016-03-24 19:23:20

标签: sql oracle

练习一些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.

任何帮助都会有用,谢谢!

4 个答案:

答案 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`,它会显示没有重复的记录。