看来大家都很中意第二种方法 但是第二种方法问题很多啊, 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是多对多关系另外,如果用开窗函数,多表的写法很复杂啊,而且如果是多对多还是有问题啊大家应该能看出来我是个新手啦,我相信我问的问题也是比较基础的, 希望各路高手不吝赐教啊。
初略判断 第二种比较好。其他两种group by都比较耗资源.
还得看实际三张表中的数据量
在oracle中只能select聚合函数和group by中的列,
难道我要吧字段都放在group里面吗?
目前我们项目还没开始开发,
表还没建,也就没索引
更没有数据,不过将来数据量会很大,至少我想问的那几个a,b,c,d,e表数据个个都很大。我想问的是大家前期开发sql标准都是什么样的,后期会有专业dba来给我们调优
类似于这样
rank() over (partition by....) rk
.....
where rk=1
开窗函数比group by要好吗?而且这样还是用不了第二种方法了
第三个用到比较多的了查询,利用子查询也比较慢,尽量少用子查询
初步判断第二个比较好,能用联接的尽量用联接
但是第二种方法问题很多啊,
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是多对多关系另外,如果用开窗函数,多表的写法很复杂啊,而且如果是多对多还是有问题啊大家应该能看出来我是个新手啦,我相信我问的问题也是比较基础的,
希望各路高手不吝赐教啊。