显示最高工资持有人的姓名(不使用子信息)

时间:2015-05-22 04:47:51

标签: sql oracle

说那是一张桌子

Name  Salary
Joe   4000
Steve 6000

我可以这样做

select name from emp where salary = (select max(salary) from emp);

但有没有办法在不使用子查询的情况下执行此操作?请帮忙。

编辑:对不起,我忘了提到我使用的是Oracle 10g而LIMIT没有使用它

5 个答案:

答案 0 :(得分:2)

您没有提到Oracle的版本。
在Oracle 12上,可以使用一个新的低限制条款:

  SELECT name
  FROM emp
  ORDER BY salary desc
  FETCH FIRST 1 ROWS ONLY;


文档中有一些例子:https://docs.oracle.com/database/121/SQLRF/statements_10002.htm#BABEAACC

在早期版本中,无需使用子查询即可完成,但如果必须创建视图:

CREATE VIEW emp_ordered AS
SELECT *
 FROM emp
ORDER BY salary desc;

然后以这种方式查询此视图:

SELECT * FROM emp_ordered
WHERE rownum <=1

答案 1 :(得分:1)

ANSI SQL答案(未指定dbms):

select Name, Salary
from emp
order by Salary desc
fetch first 1 row only

编辑:适用于较新的Oracle版本。

答案 2 :(得分:1)

Oracle 12c 中,引入了 top-n row limiting 功能。这允许在没有附加子查询的情况下对行进行排序。因此,不再依赖于ROWNUM和子查询中的显式排序。

例如,

SQL> SELECT ename, sal FROM emp ORDER BY sal DESC
  2  FETCH FIRST 1 row only;

ENAME             SAL
---------- ----------
KING             5000

SQL>

更新关于重复行

有一个选项 WITH TIES ,其中包含重复的行。

例如,

SQL> insert into emp(empno, ename, sal) values(1234, 'LALIT', 5000);

1 row created.

SQL> SELECT ename, sal FROM emp ORDER BY sal DESC FETCH FIRST 1 ROWS WITH TIES;

ENAME             SAL
---------- ----------
KING             5000
LALIT            5000

SQL>

答案 3 :(得分:0)

尝试

select * from emp order by salary DESC limit 1

答案 4 :(得分:0)

试试这个

SELECT name FROM emp
    ORDER BY salary DESC
    LIMIT 1