要求:查询雇员表中排在第6~9位置上的雇员SELECT ename,sal FROM (SELECT rownum as num,ename,sal FROM emp WHERE rownum<=9 ) WHERE num>=6;上面的执行是对的,但是如下的执行为什么是错的呢?请帮忙解答一下,谢谢,小弟刚开始学习。SELECT ename,sal FROM emp WHERE rownum>=6 AND rownum<=9;  这个错哪里了?

解决方案 »

  1.   

    rownum只能对一个已知的结果集排序号有没有雇员编号这样的字段,也就是主键?如果有的话,假设是enoselect ename,sal
    from
    (
    select ename,sal,row_number()over(order by eno) rn
    from emp t
    )
    where rn>=6 and rn<=9;
      

  2.   

    select ename,sal from (select ename,sal,row_bumber()over(order by ename)tt from emp)t  where t.tt>=6 and t.tt<=9
      

  3.   

    rownum是对查询结果进行赋序号的伪列。也就是说,查询结果中如果没有rownum为1的行,就不可能有rownum为2的行。自然,不可能会有rownum>=6的行。因为你所要的结果中rownum=6的那行,如果查询成功,实际上rownum是等于1
    可以通过对rownum取别名来解决。就像你上面列出的正确的那句
    where num>=6,表示是子句(SELECT rownum as num,ename,sal FROM emp WHERE rownum <=9 )中的查询结果里rownum列中值>=6的数据行
    说得够清楚吧。可惜没分,哈哈
      

  4.   

    rownum是对查询结果进行赋序号的伪列。也就是说,查询结果中如果没有rownum为1的行,就不可能有rownum为2的行。自然,不可能会有rownum>=6的行。因为你所要的结果中rownum=6的那行,如果查询成功,实际上rownum是等于1
    可以通过对rownum取别名来解决。就像你上面列出的正确的那句
    where num>=6,表示是子句(SELECT rownum as num,ename,sal FROM emp WHERE rownum <=9 )中的查询结果里rownum列中值>=6的数据行
    说得够清楚吧。可惜没分,哈哈
    很好!~明白!~