多表关联,哪种写法好

wdnaraku 2012-04-12 02:55:34
一条sql,多表关联,一个主表,但有几个一对多数据只需要取一个,
现在我写了三种,不知道哪个好,
大家帮我选一下,最好解释下,要是有更好的建议那就更好了。
a是主表
1.
select
a.id,
(select min(c.coll_nm) from b,c where a.lmt_no=b.lmt_no and b.coll_no=c.coll_no group by b.lmt_no),
(select min(d.ci_nm) from d where a.pro_no=d.ci_no group by d.ci_no),
(select e.ci_nm from e where a.ci_no=e.ci_no )
.......
from a

2.
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

3.
select
a.id,coll.coll_nm, pro.ci_nm,e.ci_nm
from a
left join (
select min(c.coll_nm) coll_nm,b.lmt_no
from b,c
where b.coll_no=c.coll_no
group by b.lmt_no) coll
on a.lmt_no=coll.lmt_no
left join (
select min(d.ci_nm) pro_nm
from d
group by d.ci_no) pro
on pro.pro_no=d.ci_no
left join e on a.ci_no=d.ci_no
.......
...全文
268 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdnaraku 2012-04-17
  • 打赏
  • 举报
回复
不要沉,每天都在等答案呢
lixiaoyu0707 2012-04-13
  • 打赏
  • 举报
回复
第二个。
wdnaraku 2012-04-13
  • 打赏
  • 举报
回复
看来大家都很中意第二种方法
但是第二种方法问题很多啊,
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是多对多关系

另外,如果用开窗函数,多表的写法很复杂啊,而且如果是多对多还是有问题啊

大家应该能看出来我是个新手啦,我相信我问的问题也是比较基础的,
希望各路高手不吝赐教啊。
五更琉璃 2012-04-13
  • 打赏
  • 举报
回复
二,三 都可以 别用第一种
zwbhanye 2012-04-12
  • 打赏
  • 举报
回复
第一个SQL肯定最慢,大数据量就更能体现了。
第三个用到比较多的了查询,利用子查询也比较慢,尽量少用子查询
初步判断第二个比较好,能用联接的尽量用联接
wdnaraku 2012-04-12
  • 打赏
  • 举报
回复
select 一大堆字段 from(select 一大堆字段,rank() over(...) rk1,rank() over(...) rk2,rank() over(...) rk3 from ...) where rk1=1 and rk2=2;想想都疼
wdnaraku 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]可以使用开窗函数啊
类似于这样
rank() over (partition by....) rk
.....
where rk=1
[/Quote]

开窗函数比group by要好吗?

而且这样还是用不了第二种方法了
yinan9 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wdnaraku 的回复:]

引用 2 楼 yinan9 的回复:

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

第二种写法还有个问题啊,我要查的字段有很多很多的,
在oracle中只能select聚合函数和group by中的列,
难道我要吧字段都放在group里面吗?
[/Quote]可以使用开窗函数啊
类似于这样
rank() over (partition by....) rk
.....
where rk=1
wdnaraku 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

表的数据量,匹配比!索引情况,啥都不说,搞蛋啊!
[/Quote]
可能我问题描述不够清楚,
目前我们项目还没开始开发,
表还没建,也就没索引
更没有数据,不过将来数据量会很大,至少我想问的那几个a,b,c,d,e表数据个个都很大。

我想问的是大家前期开发sql标准都是什么样的,后期会有专业dba来给我们调优

wdnaraku 2012-04-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yinan9 的回复:]

看下执行计划吧
初略判断 第二种比较好。其他两种group by都比较耗资源.
还得看实际三张表中的数据量
[/Quote]
第二种写法还有个问题啊,我要查的字段有很多很多的,
在oracle中只能select聚合函数和group by中的列,
难道我要吧字段都放在group里面吗?
啊彪123 2012-04-12
  • 打赏
  • 举报
回复
表的数据量,匹配比!索引情况,啥都不说,搞蛋啊!
yinan9 2012-04-12
  • 打赏
  • 举报
回复
看下执行计划吧
初略判断 第二种比较好。其他两种group by都比较耗资源.
还得看实际三张表中的数据量
wdnaraku 2012-04-12
  • 打赏
  • 举报
回复
貌似大家都没啥反应啊

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧