上面的好。他是先将金额按倒序排然后在查行号为二的那跳记录。你写的sql文有点问题的
select * from emp where sal=(select max(sal) from emp where sal<>(select max(sal) from emp));
思路是,先把最高的剔除掉,select max(sal) from emp,然后,再找剔除后的最高的select max(sal) from emp where sal<>(select max(sal) from emp),最后,查sal=第二高的就行。主要是思路要清晰。
(select ename ,sal from (select * from emp order by sal desc) where rownum<=2 order by sal) where rownum<=1;个人认为是这个 你的那种事属于子查询 要说也行 可第一个是行列的那种 只是建议
所给答案如果是第一高、第二高的工资人数都不止一人的话是不能解决问题的。
SELECT EMPNO,ENAME,SAL
FROM EMP
/
以下是我的思路,看似虽多,其实仔细琢磨,是很简单的。
SELECT EMPNO,ENAME,SAL
FROM (SELECT EMPNO,ENAME,SAL FROM EMP
WHERE SAL<(SELECT MAX(SAL) FROM EMP))
WHERE SAL>=ALL(SELECT SAL FROM EMP
WHERE SAL <(SELECT MAX(SAL) FROM EMP))
/
其实:解决问题的思路有很多,答案不唯一。数据库的优化就需要考虑这些问题了。
偶然看到了,说了几句,希望能帮到你!!!
SELECT sal,ename
FROM ( SELECT dense_rank()over (
ORDER BY sal DESC
) AS rank,sal,ename
FROM emp
)
WHERE rank > = 2