本帖最后由 wdnaraku 于 2012-04-12 15:05:51 编辑

解决方案 »

  1.   

    看下执行计划吧
    初略判断 第二种比较好。其他两种group by都比较耗资源.
    还得看实际三张表中的数据量
      

  2.   

    第二种写法还有个问题啊,我要查的字段有很多很多的,
    在oracle中只能select聚合函数和group by中的列,
    难道我要吧字段都放在group里面吗?
      

  3.   

    可能我问题描述不够清楚,
    目前我们项目还没开始开发,
    表还没建,也就没索引
    更没有数据,不过将来数据量会很大,至少我想问的那几个a,b,c,d,e表数据个个都很大。我想问的是大家前期开发sql标准都是什么样的,后期会有专业dba来给我们调优
      

  4.   

    可以使用开窗函数啊
    类似于这样 
    rank() over (partition by....) rk
    .....
    where rk=1
      

  5.   


    开窗函数比group by要好吗?而且这样还是用不了第二种方法了
      

  6.   

    select 一大堆字段 from(select 一大堆字段,rank() over(...) rk1,rank() over(...) rk2,rank() over(...) rk3 from ...) where rk1=1 and rk2=2;想想都疼
      

  7.   

    第一个SQL肯定最慢,大数据量就更能体现了。
    第三个用到比较多的了查询,利用子查询也比较慢,尽量少用子查询
    初步判断第二个比较好,能用联接的尽量用联接
      

  8.   

    看来大家都很中意第二种方法
    但是第二种方法问题很多啊,
    select
    a.id,min(c.coll_nm), min(d.ci_nm),e.ci_nm
    from a
    left join b on a.lmt_no=b.lmt_no
    left join c on b.coll_no=c.coll_no
    left join d on a.pro_no=d.ci_no
    left join e on a.ci_no=d.ci_no
    .......
    group by b.lmt_no,d.ci_no
    1。不在group by 中的字段比如a.id是不能select的
       除非group by a.id(这种结果会不对啊)
       或者a.id也加上聚合函数,这种应该没问题,但是看起来很奇怪啊2.本身这种group by的方式返回结果也可能是错的
      比如a.ci_no和d.ci_no是多对多关系另外,如果用开窗函数,多表的写法很复杂啊,而且如果是多对多还是有问题啊大家应该能看出来我是个新手啦,我相信我问的问题也是比较基础的,
    希望各路高手不吝赐教啊。