大神帮我看下这个是什么问题

--查找出部门10和部门20中,工资最高第3名到第5名的员工的员工名字,部门名字,部门位置
select * from
(select ename,sal,dept.* from emp
join dept on dept.deptno=emp.deptno
where emp.deptno != 30 order by sal desc )
where rownum between 3 and 5;

本来应该是有的,结果显示未选定行

9个回答

select * from (
    select mysal.*, rownum rn from (
        select e.ename, e.sal, e.deptno from emp e join dept d on e.deptno=d.deptno
        where e.deptno != 30 order by sal desc) mysal
            where rownum <= 5)
                where rn >= 3;

                另外不用在这里不用left也是可以的= =~

rownum在使用select查询的时候,自动生成的一串顺序号。在每返回一条数据结果的时候,rownum就自动加一。简单的说,是对结果集加的一个伪列,是oracle数据库从数据文件或缓冲区中读取数据的顺序。用>,>=,=,between...and这几个条件结果是没有数据的,因为你从缓冲区或数据文件中查询得到的第一条记录的rownum为1,则会被删除的,接着读取下一条数据,可是它的rownum又变成了1,结果又被删除掉了,所以查询的结果是没有数据。
所以只能用< <=

这么6的SQL, 看着醉了

select * from
(select e.ename,e.sal,de.* from emp e
join dept de on de.deptno=e.deptno
where e.deptno != 30 order by e.sal desc )
where rownum between 3 and 5;
试试

用left join ,标准的是left outer join

jekingku
jekingku 都试了,结果还是那样-_-
大约 3 年之前 回复

少关键字啊,join前面要加right/left/inner

jekingku
jekingku inner join 和join 好像是一样的吧?
大约 3 年之前 回复

rownum between 是谁教你的?

    select * from (
        select mysal.*, rownum rn from (
            select * from emp e left join dept d on e.deptno=d.deptno
            where e.deptno != 30 order by sal desc) mysal
                where rownum <= 5)
                    where rn >= 3;

应该是rownum between的关系

666,我懂了,谢谢楼上的

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问