2016-03-24 77 views
1

练习一些SQL,我们必须得到薪水最高的员工的名字。但是如果在任何部门有不止一个薪水最高的雇主,我们就不必考虑那个部门。SQL select select rows rows without duplicates

我们得到了第一部分而不是第二部分(因为在同一部门(20)中有两名雇员的最高工资相同(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

只是检查。哪个RDBMS?什么样的数据类型是sal? – Strawberry

+0

RDBMS是Oracle(我忘了写它之前)和sal是一个整型数据类型@Strawberry –

回答

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; 
+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

+0

谢谢,它的工作原理! –

-5

尝试使用GROUP BY column_name`,它会显示记录不重复。

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 

第一种方式提供更好的性能,有单表扫描,而第二个需要嵌套查询,因而是少高效

+0

对于我们的问题,第二种选择是最好的,因为我们只是在学习时没有在效率上付出很多的关注。但是谢谢你的解释! –