高分求教一sql语的优化

silentcross 2007-03-15 08:46:41
共3张表

表A{a1,a2,a3,a4,a5}
表B {b1,b2,b3,b4,b5}
表C {c1,c2,c3,c4 ,c5}

连接条件
1: A.a1 = B.b1(+) and A.a2 = B.b2(+) and A.a3 = B.b3(+)
2: A.a4 = C.c1(+) and A.a5 = C.c2(+)
3: 麻烦的是这个条件,C中的数据是按c1,c2分组的,条件要求c中的数据所在组中的c3字段值最大的那条数据里对应的c4大于指定的值(假设100)

效果如下:
SELECT
B.b4, C.c5
FROM
A,
B,
C,
(SELECT C.c1,C.c2,C.c4
FROM C,
(SELECT c1, c2, max(c3) c3
FROM C
GROUP BY c1, c2) T2
WHERE
C.c1 = T2.c1 AND C.c2 = T2.c2 AND C.c3 = T2.c3) T1
WHERE
A.a1 = B.b1(+) AND
A.a2 = B.b2(+) AND
A.a3 = B.b3(+) AND
A.a4 = C.c1(+) AND
A.a5 = C.c2(+) AND
C.c1 = T1.c1 AND
C.c2 = T1.c2 AND
T1.c4 > 100

问题是这么写效率太低了,苦思一下午没想出什么办法,求高手指点
...全文
221 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
silentcross 2007-03-16
  • 打赏
  • 举报
回复
感谢城城相助,将c4条件提前的确极大缩短了执行时间,从80秒降到3秒了
你给我的代码结果上有点不一致,3层select还是不能避免
虽然实际上c4的条件没有缩小数据规模,但是效果却如此惊人,真实很奇怪
不管怎么说现在已经完全可以接受了,非常感谢
fangcheng007 2007-03-15
  • 打赏
  • 举报
回复
SELECT
B.b4, C.c5
FROM
A,
B,
C,
(SELECT c1, c2, max(c3) c3
FROM C
where c4>100
GROUP BY c1, c2) T1
WHERE
A.a1 = B.b1(+) AND
A.a2 = B.b2(+) AND
A.a3 = B.b3(+) AND
A.a4 = C.c1(+) AND
A.a5 = C.c2(+) AND
C.c1 = T1.c1 AND
C.c2 = T1.c2

注意建索引
fangcheng007 2007-03-15
  • 打赏
  • 举报
回复
SELECT
B.b4, C.c5
FROM
A,
B,
C,
(SELECT c1, c2, max(c3) c3
FROM C
where c4>100
GROUP BY c1, c2) T1
WHERE
A.a1 = B.b1(+) AND
A.a2 = B.b2(+) AND
A.a3 = B.b3(+) AND
A.a4 = C.c1(+) AND
A.a5 = C.c2(+) AND
C.c1 = T1.c1 AND
C.c2 = T1.c2 AND
fangcheng007 2007-03-15
  • 打赏
  • 举报
回复
SELECT
B.b4, C.c5
FROM
A,
B,
C,
(SELECT C.c1,C.c2,C.c4
FROM C,
(SELECT c1, c2, max(c3) c3
FROM C

GROUP BY c1, c2) T2
WHERE
C.c1 = T2.c1 AND C.c2 = T2.c2 AND C.c3 = T2.c3) T1
WHERE
A.a1 = B.b1(+) AND
A.a2 = B.b2(+) AND
A.a3 = B.b3(+) AND
A.a4 = C.c1(+) AND
A.a5 = C.c2(+) AND
C.c1 = T1.c1 AND
C.c2 = T1.c2 AND
T1.c4 > 100
silentcross 2007-03-15
  • 打赏
  • 举报
回复
补充说明一个:需要使用标准sql

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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