drop table test_olap;
-- Create table
create table TEST_OLAP
(
  CLASS NUMBER(1),
  NAME  VARCHAR2(100),
  SCORE NUMBER(4,1) default 0
);delete from test_olap;
insert into test_olap (class, name,score)values(2, 'b2', 34);
insert into test_olap (class, name,score)values(3, 'b3', 34);
commit; 
select t.class, t.name, t.score 
  from test_olap t
 where t.class > 1
 order by t.score;
查询结果:
class   name     score
  3 b3 34.0 --后插入的结果排在前面
  2 b2 34.0接下来:
delete from test_olap;
insert into test_olap (class, name, score) values (3, 'b3', 34);
insert into test_olap (class, name, score) values (2, 'b2', 34);
commit;
select t.class, t.name, t.score
  from test_olap t
 where t.class > 1
 order by t.score;
查询结果:
class   name     score
  2 b2 34.0 --后插入的结果排在前面
  3 b3 34.0为什么在排序的时候,后插入数据库的记录会排在前面呢?

解决方案 »

  1.   


    ORACEL中的记录存储是根本没有顺序的! 当你插入一条记录的时候,ORACLE会帮助你找到一个适合的block 来存储这个记录。至于这个BLOCK是以前删除记录留下的,还是新扩展的就由ORACLE自行决定了。
      

  2.   

    1楼说的对,但相同的值,你可以按照rowid来排。一般后插入的值rowid那个串会比前面的大。
      

  3.   

    ORACLE默认是不保证任何排序的
    显示出来结果的顺序就是读取数据的顺序虽然你这里加了ORDER BY
    可是由于两条记录的SCORE的值是相同的
    所以ORDER BY并起不了什么作用
      

  4.   

    drop table test_olap; 
    -- Create table 
    create table TEST_OLAP 

      CLASS NUMBER(1), 
      NAME  VARCHAR2(100), 
      SCORE NUMBER(4,1) default 0 
    ); delete from test_olap; 
    insert into test_olap (class, name,score)values(1, 'b1', 34);
    insert into test_olap (class, name,score)values(2, 'b2', 34);
    insert into test_olap (class, name,score)values(3, 'b3', 34); 
    insert into test_olap (class, name,score)values(4, 'b4', 34); 
    insert into test_olap (class, name,score)values(5, 'b5', 34); 
    commit; select t.class, t.name, t.score 
      from test_olap t 
    where t.class > 0
    order by t.score; 查询结果:
    class  name   score
    1       b1     34.0
    2       b2     34.0
    5       b5     34.0
    4       b4     34.0
    3 b3     34.0多几条测试数据测试,果然是乱序的。谢谢楼上的回答,结贴了。