一道面试题,求解有一个表,里面只有一个字段,而且存储的数据有重复的,
请不用rowid,rownumber之类的sql语句取出第5行到第7行比如:表如下只有一个name字段
NAMETom
Jerry
John
White
Black
Tom
Red
Alex
Frank
Terry
NewLand
我想了两个方法,但是好像都不行啊。
1,用sequence.nextval来自动编号
create sequence test start with 1
select test.nextval as id, name from table where id >=5 and id <=7
报错:说id这个字段不存在2,用expect连接,也就是取只在前7行出现,但是不在前5行出现的数据
select top 7 from talbe
EXPECT
select top 5 from table
一般情况下可行的,但是注意到有重复的项目,比如Tom这个名字是重复的
所以不行

解决方案 »

  1.   


    --rownum实现分页
    SQL> select rownum ,ename from emp;
     
        ROWNUM ENAME
    ---------- ----------
             1 SMITH
             2 ALLEN
             3 WARD
             4 JONES
             5 MARTIN
             6 BLAKE
             7 CLARK
             8 SCOTT
             9 KING
            10 TURNER
            11 ADAMS
            12 JAMES
            13 FORD
            14 MILLER
    SQL> select * from(
      2  select rownum rn,ename from emp where rownum <=7)
      3  where rn >=5
      4  /
     
            RN ENAME
    ---------- ----------
             5 MARTIN
             6 BLAKE
             7 CLARK
      

  2.   

    --这个算不算?
    SELECT NAME
      FROM (SELECT t.*, row_number() over(ORDER BY 1) cn FROM t)
     WHERE cn BETWEEN 5 AND 7;
      

  3.   

    不用rownum?这样行不?DECLARE
      n_count NUMBER := 0;
    BEGIN
      FOR c IN (SELECT * FROM tabs)
      LOOP
        IF n_count BETWEEN 5 AND 7
        THEN
          dbms_output.put_line(c.table_name);
        END IF;
        n_count := n_count + 1;
      END LOOP;
    END;
      

  4.   

    分析一下你的那两个方法
    第一个 你的id是在查询列中 你竟然想在where中使用 
    当前的where只能使用from后的那个表中的字段 你重新as的字段不能用 只能嵌套一层 在外层使用
    第二个 oracle貌似没有top函数吧 top是sql的函数 oracle只能order by 然后rownum来实现top
      

  5.   

    想不到能用一条sql能解决的方法,弱弱的问一下 这题是不是不是考sql,而是考别的。