查看: 11325|回复: 21

【讨论】简单的SQL, 求优化。

[复制链接]
论坛徽章:
311
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
发表于 2014-7-3 15:23 | 显示全部楼层 |阅读模式
ORACLE11203

update t_bill_monthly y set y.translation_yn ='Y'
  where y.acc_month = v_yearmonth and y.pk_salestru= v_pkSalestru
    and exists (select 'x' from t_bill_daily x where (x.report_date >= v_lmfd and x.report_date < v_cmfd)
    and x.pk_cusdoc= y.pk_cusdoc and x.pk_salestru= y.pk_salestru and x.translation_yn='Y');

update t_bill_monthly y set y.rebate_yn ='Y'
  where y.acc_month = v_yearmonth and y.pk_salestru= v_pkSalestru
    and exists (select 'x' from t_bill_daily x where (x.report_date >= v_lmfd and x.report_date < v_cmfd)
    and x.pk_cusdoc= y.pk_cusdoc and x.pk_salestru= y.pk_salestru and x.rebate_yn = 'Y');

update t_bill_monthly y set y.receivables_yn ='Y'
  where y.acc_month = v_yearmonth and y.pk_salestru= v_pksalestru
    and exists (select 'x' from t_bill_daily x where (x.report_date >= v_lmfd and x.report_date < v_cmfd)
    and x.pk_cusdoc= y.pk_cusdoc and x.pk_salestru= y.pk_salestru and x.receivables_yn='Y');
论坛徽章:
401
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2014-7-3 15:32 | 显示全部楼层
3句有什么不同

使用道具 举报

回复
论坛徽章:
27
ITPUB官方微博粉丝徽章
日期:2011-08-17 10:35:36托尼托尼·乔巴
日期:2017-10-25 16:45:57秀才
日期:2017-04-05 13:18:06秀才
日期:2017-03-02 10:35:322016猴年福章
日期:2016-02-23 09:58:342016猴年福章
日期:2016-02-18 09:31:302015年新春福章
日期:2015-03-06 11:57:312014年新春福章
日期:2014-02-18 16:42:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31
发表于 2014-7-3 15:38 | 显示全部楼层
〇〇 发表于 2014-7-3 15:32
3句有什么不同

最后一个And的字段不同

使用道具 举报

回复
论坛徽章:
401
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2014-7-3 15:42 | 显示全部楼层
gyhgood 发表于 2014-7-3 15:38
最后一个And的字段不同

那就把不同的and 用or 连起来
然后在update set中(a,b,c)=(decode(translation_yn,'Y','Y',a),...)

使用道具 举报

回复
论坛徽章:
401
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
发表于 2014-7-3 15:47 | 显示全部楼层
〇〇 发表于 2014-7-3 15:42
那就把不同的and 用or 连起来
然后在update set中(a,b,c)=(decode(translation_yn,'Y','Y',a),...)

但更新的量可能就多了很多

使用道具 举报

回复
论坛徽章:
78
生肖徽章2007版:牛
日期:2012-08-02 22:43:00紫蛋头
日期:2012-12-08 09:43:38鲜花蛋
日期:2012-11-17 12:02:07鲜花蛋
日期:2013-02-05 21:53:34复活蛋
日期:2012-11-17 12:02:07SQL极客
日期:2013-12-09 14:13:35SQL数据库编程大师
日期:2013-12-06 13:59:43SQL大赛参与纪念
日期:2013-12-06 14:10:50ITPUB季度 技术新星
日期:2012-11-27 10:16:10最佳人气徽章
日期:2013-03-19 17:24:25
发表于 2014-7-3 15:47 | 显示全部楼层
merge into t_bill_monthly y
using   (select pk_cusdoc, pk_salestrupk_salestru,
                max(translation_yn) translation_yn, max(rebate_yn) rebate_yn, max(receivables_yn) receivables_yn
        from    t_bill_daily
        where   (translation_yn='Y' or rebate_yn = 'Y' or receivables_yn='Y')
        and     report_date >= v_lmfd and report_date < v_cmfd
        group by pk_cusdoc, pk_salestrupk_salestru
        ) x
on    (x.pk_cusdoc= y.pk_cusdoc and x.pk_salestru= y.pk_salestru)
when matched then update set
  y.translation_yn =x.translation_yn,
  y.rebate_yn =x.rebate_yn,
  y.receivables_yn =x.receivables_yn

使用道具 举报

回复
论坛徽章:
289
蛋疼蛋
日期:2013-03-29 13:46:58优秀写手
日期:2013-12-24 06:00:12福特
日期:2014-02-17 17:30:59生肖徽章:兔
日期:2012-05-24 19:03:36SQL极客
日期:2013-12-09 14:13:35ITPUB季度 技术新星
日期:2014-02-24 11:00:06IT宝贝
日期:2014-08-27 10:32:17马上加薪
日期:2014-08-05 09:18:33SQL数据库编程大师
日期:2016-01-13 10:30:43玉石琵琶
日期:2014-03-04 16:46:07
发表于 2014-7-3 15:57 | 显示全部楼层
where后面一样?直接 set a='Y',B='Y' ,C='Y'

使用道具 举报

回复
论坛徽章:
311
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
 楼主| 发表于 2014-7-3 16:07 | 显示全部楼层
〇〇 发表于 2014-7-3 15:32
3句有什么不同

就最后那一段:x.translation_yn='Y 不同。

使用道具 举报

回复
论坛徽章:
311
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
 楼主| 发表于 2014-7-3 16:08 | 显示全部楼层
〇〇 发表于 2014-7-3 15:42
那就把不同的and 用or 连起来
然后在update set中(a,b,c)=(decode(translation_yn,'Y','Y',a),...)

我这样尝试过,但失败,好像是与老的写法得到的结果集不同。


看我这两种写法,哪个是对的?我一直没敢使用。
merge into t_bill_monthly y using (select * from t_bill_daily where (report_date >= v_lmfd and report_date < v_cmfd) and pk_salestru = v_pksalestru) x
  on (y.acc_month = v_yearmonth and y.pk_cusdoc= x.pk_cusdoc and y.pk_salestru = x.pk_salestru)
  when matched then update set y.translation_yn = decode(x.translation_yn,'Y','Y',y.translation_yn),
                               y.rebate_yn = decode(x.rebate_yn,'Y','Y',y.rebate_yn),
                               y.receivables_yn = decode(x.receivables_yn,'Y','Y',y.receivables_yn);

  merge into t_bill_monthly y using (select y.rowid rid, x.translation_yn, x.rebate_yn, x.receivables_yn from t_bill_daily x, t_bill_monthly y
                                      where (x.report_date >= v_lmfd and x.report_date < v_cmfd)
                                        and x.pk_salestru = v_pksalestru
                                        and x.pk_cusdoc = y.pk_cusdoc
                                        and x.pk_salestru = y.pk_salestru
                                        and y.acc_month = v_yearmonth) x
  on (y.rowid=x.rid)
  when matched then update set y.translation_yn = decode(x.translation_yn,'Y','Y',y.translation_yn),
                               y.rebate_yn = decode(x.rebate_yn,'Y','Y',y.rebate_yn),
                               y.receivables_yn = decode(x.receivables_yn,'Y','Y',y.receivables_yn);

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2014-7-3 16:11 | 显示全部楼层




Please test the following sql statement to see whether it would retrive right recordsets and run also efficiently.

merge into t_bill_monthly a
using(select y.pk_cusdoc,
             y.pk_salestru,
             x.translation_yn,
             x.rebate_yn,
             x.receivables_yn
        from t_bill_monthly y,
             t_bill_daily x
       where x.pk_cusdoc = y.pk_cusdoc
         and x.pk_salestru = y.pk_salestru
         and x.report_date >= v_lmfd
         and x.report_date < v_cmfd
         and y.acc_month = v_yearmonth
         and y.pk_salestru = v_pkSalestru
         and (x.translation_yn = 'Y' or x.rebate_yn = 'Y' or x.receivables_yn = 'Y')) b
on(a.pk_cusdoc = b.pk_cusdoc and a.pk_salestru = b.pk_salestru)
when matched then
     update set a.translation_yn = decode(b.translation_yn, 'Y', 'Y', a.translation_yn),
                a.rebate_yn = decode(b.rebate_yn, 'Y', 'Y', a.rebate_yn),
                a.receivables_yn = decode(b.receivables_yn, 'Y', 'Y', a.receivables_yn);







使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表