SELECT * FROM tab WHERE rownum < 10 ORDER BY id;先按tab中存储的记录的顺序取出9条记录,然后再将取出来的9条记录按id排序,不能保证取出来的记录id是整个表中最小的9条。SELECT * FROM (SELECT * FROM tab ORDER BY id) WHERE rownum < 10;
先将tab中存储的所有记录按id排序,再将排序后的记录取出前9条,是取出id最小的9条记录的oracle的写法,取出来的记录id是整个表中最小的9条
以上与id是否为主键无关,只是如果你的id是主键又是递增存储的话与记录的物理顺序正好对应,两句取出来的结果一样只是一种巧合。

解决方案 »

  1.   

    2楼的这些观点:SELECT * FROM tab WHERE rownum < 10 ORDER BY id;先按tab中存储的记录的顺序取出9条记录,然后再将取出来的9条记录按id排序,不能保证取出来的记录id是整个表中最小的9条。SELECT * FROM (SELECT * FROM tab ORDER BY id) WHERE rownum < 10;
    先将tab中存储的所有记录按id排序,再将排序后的记录取出前9条,是取出id最小的9条记录的oracle的写法,取出来的记录id是整个表中最小的9条完全同意!但是最后一句,我有点疑问
      

  2.   

    如下:
    Select * From z_test
    name    code      id 
    111 1 1
    222 2 2
    555 5 5
    444 4 4
    333 3 3id是主键SELECT * FROM z_test WHERE rownum < 4 ORDER BY id;
    SELECT * FROM (SELECT * FROM z_test ORDER BY id) WHERE rownum < 4
    结果集相同
    name    code      id
    111 1 1
    222 2 2
    333 3 3
    SELECT * FROM z_test WHERE rownum < 4 ORDER BY code;
    SELECT * FROM (SELECT * FROM z_test ORDER BY code) WHERE rownum < 4
    结果集不同,分别为:
    name    code      id
    111 1 1
    222 2 2
    555 5 5name    code      id
    111 1 1
    222 2 2
    333 3 3上面两条sql和下面两条sql的差别就是order by的字段不同,值相同,一个是code,一个是id(主键)望达人解释
      

  3.   

    SELECT * FROM table WHERE rownum < N ORDER BY id;
    先选出table表中前N条记录,再按id列进行排序
    ----------------------------------------------------------------
    SELECT * FROM (SELECT * FROM table ORDER BY id) WHERE rownum < N;
    先对table表按id列进行排序,再取出排序后的前N条记录
      

  4.   

    基本同意楼上
    补充一点:
    SELECT * FROM tab WHERE rownum < 10 ORDER BY id;
    当id为primary key的时候,
    如果该查询走索引,那么很可能结果和
    SELECT * FROM (SELECT * FROM tab ORDER BY id) WHERE rownum < 10;,
    因为主键索引通常都是排序的,走索引那么相当于已经排序取前10条记录;
    --不过即使是索引,这个查询可能还是不走索引的,所以用这个方法取前10是不可靠的
      

  5.   

    谢谢 yxxx(小孬) 指正。我想是否与索引有关?oracle创建主键就自动创建一个索引的。
      

  6.   

    是主键的话,默认有个唯一的索引,是不是只要order by 的是主键的话,结果就一样了?
      

  7.   

    我曾经也发帖问过这个问题,看看他们的回答会不会对你有帮助.
    http://community.csdn.net/Expert/topic/4284/4284355.xml?temp=.5392725
      

  8.   

    走索引应该就一样,不走索引就不一样
    --------------------------------------------
    但是即使是主键,但是查询可能还是不走索引的,所以结果可能还是不一样的
    走不走索引oracle有自己的一套原则
    比如这张表数据很少就几十条,那么就很可能不走索引,因为这个时候走索引效率反而下降