9i的环境下,用到GROUP BY的SQL文中ORDER BY 没用, 检索结果却能自动排序(GROUP的键)10i的环境下,用到GROUP BY的SQL文中ORDER BY 没用, 检索结果不能自动排序.为何?,如何才能让它在10i的环境下,能得到9i的环境下的检索结果.(SQL不变)

解决方案 »

  1.   

    表数据如下:
    (字段A)     (字段B)
    101000203  84
    101000202  83
    101100400  859g: select A ,B from tabXX group by A  结果如下;(好象能自动派序)
    (字段A)     (字段B)
    101000202  83
    101000203  84
    101100400  8510g: select A ,B from tabXX group by A  结果如下;(字段A)     (字段B)
    101000203  84
    101000202  83
    101100400  85现在系统升级,9g下能运行的程序,10g下就不行了, 因为检索结果的顺是必须的,文件输出等等,
    这样的SQL文有很多,一个一个该,测试等非常繁琐,  谁有好点的方法啊..
    谢谢  wiler(@_@)  关注!!!
      

  2.   

    不了解9i,10g,帮楼主顶一下,希望高手lai解释。
      

  3.   

    oracle数据库是没有默认排序的
    要排序必须加上order by
    lz的这种情况是一种巧合
    因为oracle是按块进行读取数据的
    如果数据按顺序存储,则可能使读取出来的数据是按顺序的,给用户误解为默认排序,我也曾经
    误解过,是斑竹点醒了我,^_^
      

  4.   

    我来出一个,刚遇到的不知道是不是不同。没看官方的文档。
    9i中给一个用户赋予connect角色,这个用于可以create table,但是在10g中,同样的授权却不能创建表。
      

  5.   

    这中情况有很多地方出现,  9g->10g,10g下的检索结果就是没有排序,
    应该不是巧合,
    当然数句有很多条,系统已经运行2年了, 9g应该是自动排序的,不然早就出错了,
    10g是第一次运行,就是没排序,数据也是和9g下一模一样的,一般都是2个或2个以上的表关联SQL文有问题,
    不仅GROUP BY , DISTINCT 也一样,  比如 
    9i:select distinct A.a,A.b,B.a,B.b From A,B where A.c=b.c and A.d=b.d  (检索结果自动派序)
    10i:select distinct A.a,A.b,B.a,B.b From A,B where A.c=b.c and A.d=b.d  (没排)可能ORACLE有设置? 现在只有2台9g,1台10g,9g都没问题,
    和ORACLE在INIT.ORA的sort_area_size的大小有没有关系啊!
      

  6.   

    10g还没用过,我想可能是10g在这方面做了优化,9i和以前版本group by 和 distinct 的时候在排序上消耗不少,10g这么做应该能提高不少效率,因为不一定每个group by 和 distinct 都需要排序的,需要排序根据实际情况添加order by就可以了
      

  7.   

    为什么lz的数据在9i下是排序的呢?
    回答: lz的系统原是在9下运行的,正常的操作,如插入,修改都是在9下执行。再看数据,101000202,101000203,肯定是顺序插入,肯少有人先插入101000203,再插入101000202. (一个他自己的rowid).而同时,oracle是按块进行读取数据,那些按块顺序写进去的数据也就被顺序的读了出来,所以,一般是排序的(根据rowid的顺序)。 注意,是一般,不是绝对。为什么10下面不排序呢?
    因为数据的来源是9升级来的。升级的方法应该是导入导出,这种方法破坏了原来数据的排列顺序,也就是说每行对应的rowid不一定还与9相同.如果不同,那顺序就乱了。
    验证方法,在10下面,建一个测试表,顺序插入一些值,如101000202,101000203,再查询,肯定是排序的。
      

  8.   

    9i默认按照group by 的第一个列排的,ocp里面提到过
      

  9.   

    select 的时候是按ROWID来显示的,9和10一样,
    ORDER BY 的时候就绝对不时按ROWID来显示的,可能和 duanzilin(寻) 说的一样:10g在这方面做了优化。
    谢谢各位,天黑就结贴.
      

  10.   

    这个是ORACLE 10G R2的一个BUG
    在oracle 10g 10.2.0.3中将解决
    使用以下方法即可:方法一:
    禁止HASH GROUP BY 的使用
    Alter system set optimizer_features_enable=’ 10.1.0’ scope=spfile;方法二、
    设置_gby_hash_aggregation_enabled参数为FALSE
    Alter system set "_gby_hash_aggregation_enabled"=false scope=spfile;
      

  11.   

    这个是网上搜到的,我们也碰到过,根据这个方法解决了,你根据自己的情况修改一下参数就可以了,不需要修改文件那么麻烦。
    不过换数据库就不行了,目前还没有找到在Sybase ASE/Sybase IQ中的解决办法,不知道哪位大侠知道。
      

  12.   

    这一看就是oracle的bug,及时给数据库打补丁了,这是最简单的方法了.
      

  13.   

    修改隐含参数吧,10g默认的group by 并不进行排序,必须强制使用order by 才可以http://xzh2000.itpub.net/post/96/228455
      

  14.   

    如果你要使数据应该主动的添加Order by,不要因为9g提供默认排序就吧这个省略点
      

  15.   

    增加显示排序slelect * from
    (
        select A ,count(B) B from tabXX group by A 
    ) TB
    order by B如果不做order执行直接执行类似 select * from TB 的语句查出结果的顺序是不一定的,有时是这样,有时是那样,Oracle 8i,9i,10g,Sqlserver2000都有这样的问题
      

  16.   

    oracle数据库是没有默认排序的
    要排序必须加上order by
    lz的这种情况是一种巧合
    因为oracle是按块进行读取数据的
    如果数据按顺序存储,则可能使读取出来的数据是按顺序的,给用户误解为默认排序,我也曾经
    误解过,是斑竹点醒了我,^_^解释的很有道理,应该加上order by,否则不能保证在各种环境下都正常运行。
      

  17.   

    最好的解决办法就是都加上ORDER BY,也是一种写SQL的好习惯
      

  18.   

    河 南 速 达 软 件 大 实 惠
    速达软件是专门针对国内中小企业开发的简洁实用的进、销、存和财务、办公OA方面的管理软件,产品有速达3000、速达3000Pro、速达3000XP、速达3000.NET和速达5000系列E3pro等ERP管理软件,在国内的中小企业中取得了相当不错的口碑。河南企星公司作为速达软件在河南区域特别是在郑州最大的核心合作伙伴最优秀售后服务商,经过对速达软件数年的运作积累,拥有强大的技术能力、丰富的实施经验和完善的售后服务,最近有被速达中国授予速达软件河南服务中心,全面负责速达软件在河南区域的售后服务工作.速达软件和河南企星公司将一如既往的为您和您的企业提供管理帮助和技术支持!详情请垂询:河南企星科技   陈鹏科  0371—65791013
                                                                   13783647765
                                                                [email protected]
    www.zzsuda.com
    www.hatcsoft.com