怎样解决“使用case...when...导致的性能低下”的问题呢?

ypopo1234 2008-07-01 09:52:55
以下语句执行下来需要2.3秒,相当的慢,主要在于使用了三个case when,去掉这三个case ,执行速度还是没问题,怎么修改
三个case...when...,使之能达到同样的效果呢,谢谢你们。

select case when t.je1 is null then
(select sum(t1.TOTAL_PRICE)
from FWLR_YJ t1
where t1.HTL_DD_ID = t.id
and t1.type = '吃饭')
else
(select sum(t2.TOTAL_PRICE)
from FWLR_SJ t2
where t2.HTL_DD_ID = t.id
and t2.type = '吃饭')
end as cyFeeSum,
case
when t.je1 is null then
(select sum(t1.TOTAL_PRICE)
from FWLR_YJ t1
where t1.HTL_DD_ID = t.id
and t1.type = '睡觉')
else
(select sum(t2.TOTAL_PRICE)
from FWLR_SJ t2
where t2.HTL_DD_ID = t.id
and t2.type = '睡觉')
end as zsFeeSum
from gp_dd t, jg d
where t.org_id = d.jcdm
order by orgName, supplierName, startTime desc
...全文
848 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hebo2005 2008-07-01
  • 打赏
  • 举报
回复
SELECT   sum(DECODE (t.je1,
NULL, DECODE (t1.TYPE, '吃饭', t1.total_price, 0),
DECODE (t2.TYPE, '吃饭', t2.total_price, 0)
)) cyfeesum,
sum(DECODE (t.je1,
NULL, DECODE (t1.TYPE, '睡觉', t1.total_price, 0),
DECODE (t2.TYPE, '睡觉', t2.total_price, 0)
)) zsfeesum
FROM gp_dd t, jg d, fwlr_yj t1, fwlr_sj t2
WHERE t.org_id = d.jcdm AND t1.htl_dd_id(+) = t.ID AND t2.htl_dd_id(+) = t.ID
group by t.id
ORDER BY orgname, suppliername, starttime DESC

这样应该不会少了,全部根据t.id

ypopo1234 2008-07-01
  • 打赏
  • 举报
回复
楼上的大哥,你辛苦了,承认你想的有点巧妙,比上面那位说用nvl的兄弟强了一点,不过,这样写肯定不能符合要求,为什么呢,因为你同时把
fwlr_yj t1, fwlr_sj t2两张表作了关联,这样查出来的结果就算正确,也会少一些记录了,不行
ypopo1234 2008-07-01
  • 打赏
  • 举报
回复
(select sum(t1.TOTAL_PRICE) from decode(t.je1,null,'FWLR_YJ','FWLR_SJ') as t1
where t1.HTL_DD_ID=t.id and t1.type = '吃饭') as cyFeeSum
为什么这样写不行哦!,decode不能这样用吗
hebo2005 2008-07-01
  • 打赏
  • 举报
回复
忘记加sum了和group by 了


SELECT sum(DECODE (t.je1,
NULL, DECODE (t1.TYPE, '吃饭', t1.total_price, 0),
DECODE (t2.TYPE, '吃饭', t2.total_price, 0)
)) cyfeesum,
sum(DECODE (t.je1,
NULL, DECODE (t1.TYPE, '睡觉', t1.total_price, 0),
DECODE (t2.TYPE, '睡觉', t2.total_price, 0)
)) zsfeesum
FROM gp_dd t, jg d, fwlr_yj t1, fwlr_sj t2
WHERE t.org_id = d.jcdm AND t1.htl_dd_id = t.ID AND t2.htl_dd_id = t.ID
group by t.id
ORDER BY orgname, suppliername, starttime DESC


hebo2005 2008-07-01
  • 打赏
  • 举报
回复
你这个子查询效率很低的,可以看下执行计划
hebo2005 2008-07-01
  • 打赏
  • 举报
回复

SELECT DECODE (t.je1,
NULL, DECODE (t1.TYPE, '吃饭', t1.total_price, 0),
DECODE (t2.TYPE, '吃饭', t2.total_price, 0)
) cyfeesum,
DECODE (t.je1,
NULL, DECODE (t1.TYPE, '睡觉', t1.total_price, 0),
DECODE (t2.TYPE, '睡觉', t2.total_price, 0)
) zsfeesum
FROM gp_dd t, jg d, fwlr_yj t1, fwlr_sj t2
WHERE t.org_id = d.jcdm AND t1.htl_dd_id = t.ID AND t2.htl_dd_id = t.ID
ORDER BY orgname, suppliername, starttime DESC
ypopo1234 2008-07-01
  • 打赏
  • 举报
回复
decode,nvl我都试过了,不能表达与它同样的功能出来,decode是不是不能嵌套的呢,嵌套就出错。
fibbery 2008-07-01
  • 打赏
  • 举报
回复
1、看看子查询能否转换成表之间的连接
2、使用nvl来替换你的case语句
hebo2005 2008-07-01
  • 打赏
  • 举报
回复
贴贴你的执行计划,看看慢在哪里
ypopo1234 2008-07-01
  • 打赏
  • 举报
回复
这样确实不会少了,让你费心拉,速度没有改善,呵呵。没事。

17,090

社区成员

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

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