说那是一张桌子
Name Salary
Joe 4000
Steve 6000
我可以这样做
select name from emp where salary = (select max(salary) from emp);
但有没有办法在不使用子查询的情况下执行此操作?请帮忙。
编辑:对不起,我忘了提到我使用的是Oracle 10g而LIMIT没有使用它答案 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