查看: 3224|回复: 13

[性能调整] 这个语句还有优化的余地吗

[复制链接]
论坛徽章:
4
奥运会纪念徽章:射击
日期:2008-10-24 13:23:422010新春纪念徽章
日期:2010-03-01 11:19:072010数据库技术大会纪念徽章
日期:2010-05-13 09:34:23ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
发表于 2009-12-11 13:28 | 显示全部楼层 |阅读模式
优化是肯定的,兄弟们看看还有什么办法.谢谢...

select a.fund_account,
       a.handling_charge,
       b.unwinding_profit,
       c.handling_charge,
       d.ljdwjz
  from (select fund_account, sum(handling_charge) as handling_charge
          from tb_deal_detail
         group by fund_account) a,
       (select t2.fund_account, sum(t1.unwinding_profit) as unwinding_profit
          from tb_close t1, tb_unite t2
         where t2.id = t1.tb_unite_id
         group by t2.fund_account) b,
       (select fund_account, sum(trade_sum) as handling_charge
          from tb_deal_detail
         group by fund_account) c,
       (select FUND_ACCOUNT, ljdwjz
          from tb_unite
         where id in (select id
                        from (select max(id) as id, FUND_ACCOUNT
                                from tb_unite
                               group by fund_account))) d
where a.fund_account = b.fund_account
   and a.fund_account = c.fund_account
   and a.fund_account = d.fund_account
2009-12-11_132818.jpg
论坛徽章:
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
发表于 2009-12-11 13:35 | 显示全部楼层
这一段,可以考虑用聚组函数来过滤

(select FUND_ACCOUNT, ljdwjz
          from tb_unite
         where id in (select id
                        from (select max(id) as id, FUND_ACCOUNT
                                from tb_unite
                               group by fund_account)))

使用道具 举报

回复
论坛徽章:
4
奥运会纪念徽章:射击
日期:2008-10-24 13:23:422010新春纪念徽章
日期:2010-03-01 11:19:072010数据库技术大会纪念徽章
日期:2010-05-13 09:34:23ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
 楼主| 发表于 2009-12-11 13:49 | 显示全部楼层
原帖由 ZALBB 于 2009-12-11 13:35 发表
这一段,可以考虑用聚组函数来过滤

(select FUND_ACCOUNT, ljdwjz
          from tb_unite
         where id in (select id
                        from (select max(id) as id, FUND_ACCOUNT
                                from tb_unite
                               group by fund_account)))


版主,如何实现? 提示下,谢谢.
吼吼

使用道具 举报

回复
论坛徽章:
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
发表于 2009-12-11 16:31 | 显示全部楼层
1 我想像中的与你的情况有些差异,看看是不是你的语句有问题,还是我的语句没满足你的情况?

SCOTT@portal>select * from tb_unite;

              ID FUND_ACCOUNT         LJDWJZ
---------------- -------------------- -----------------
               1 zhf                  001
               2 zhf                  001
               3 zhf                  001
               1 zky                  002
               2 zky                  002
               7 zky                  002
               1 yjg                  003
               2 yjg                  003
               6 yjg                  003
               9 yjg                  003
               1 sl                   007
               2 sl                   007
               6 sl                   007
               9 sl                   007
              11 sl                   007
              12 sl                   007
              26 sl                   007
              19 sl                   007

18 rows selected.

你的语句返回5条记录,而我的写法只有4条,你看看多出的一条,是不是你所期望的?
SCOTT@portal>(select FUND_ACCOUNT, ljdwjz
  2            from tb_unite
  3           where id in (select id
  4                          from (select max(id) as id, FUND_ACCOUNT
  5                                  from tb_unite
  6                                 group by fund_account))
  7                                 );

FUND_ACCOUNT         LJDWJZ
-------------------- --------------------
zhf                  001
zky                  002
yjg                  003
sl                   007
sl                   007

5 rows selected.

Elapsed: 00:00:00.01
SCOTT@portal>select fund_account, ljdwjz from
  2  (select a.*, rank() over(partition by fund_account order by id desc) seq from tb_unite a)
  3  where seq=1;

FUND_ACCOUNT         LJDWJZ
-------------------- --------------------
sl                   007
yjg                  003
zhf                  001
zky                  002

4 rows selected.

使用道具 举报

回复
论坛徽章:
136
ITPUB年度最佳技术回答奖
日期:2010-06-12 13:17:14现代
日期:2013-10-02 14:53:59路虎
日期:2013-11-22 12:26:182014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14
发表于 2009-12-11 16:34 | 显示全部楼层
(select fund_account, sum(handling_charge) as handling_charge
          from tb_deal_detail
         group by fund_account) a,
(select fund_account, sum(trade_sum) as handling_charge
          from tb_deal_detail
         group by fund_account) c,

把这2个合并成一个

使用道具 举报

回复
论坛徽章:
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
发表于 2009-12-11 16:49 | 显示全部楼层


Try!

select a.fund_account,
       a.handling_charge,
       b.unwinding_profit,
       a.trade_sum,
       d.ljdwjz
  from (select fund_account,
               sum(handling_charge) handling_charge,
               sum(trade_sum) trade_sum
          from tb_deal_detail
         group by fund_account) a,
       (select t2.fund_account,
               sum(t1.unwinding_profit) unwinding_profit
          from tb_close t1, tb_unite t2
         where t2.id = t1.tb_unite_id
         group by t2.fund_account) b,
       (select fund_account,
               ljdwjz
          from (select fund_account,
                       ljdwjz,
                       id,
                       max(id) over(partition by fund_account) max_id
                  from tb_unite)
         where id = max_id) d
where a.fund_account = b.fund_account
  and a.fund_account = d.fund_account;

使用道具 举报

回复
论坛徽章:
5
2009日食纪念
日期:2009-07-22 09:30:00ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512010广州亚运会纪念徽章:自行车
日期:2010-12-20 14:34:452011新春纪念徽章
日期:2011-01-04 10:26:432011新春纪念徽章
日期:2011-02-18 11:43:32
发表于 2009-12-11 17:25 | 显示全部楼层

回复 #4 ZALBB 的帖子

不是思路有问题,是构造测试数据的时候出问题了
9 sl                   007
  9 yjg                  003
你这里有两个相同的ID号,所以查询出来,会有重复

使用道具 举报

回复
论坛徽章:
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
发表于 2009-12-11 17:48 | 显示全部楼层

回复 #7 macheraters 的帖子

我是问,是你的语句OK,还是我的语句OK,或者说,两者都是可以的,因为你的数据不会出现我构造的那种数据,
因此,两语句都会得到期望的结果。

使用道具 举报

回复
论坛徽章:
2
生肖徽章2007版:鼠
日期:2008-01-02 17:35:532009新春纪念徽章
日期:2009-01-04 14:52:28
发表于 2009-12-12 13:24 | 显示全部楼层
ZALBB :
对内,共匪什么都要,就是不要脸;对外,共匪什么都不要,就是要脸。
你胆子也太大了吧

使用道具 举报

回复
论坛徽章:
4
奥运会纪念徽章:射击
日期:2008-10-24 13:23:422010新春纪念徽章
日期:2010-03-01 11:19:072010数据库技术大会纪念徽章
日期:2010-05-13 09:34:23ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
 楼主| 发表于 2009-12-15 09:04 | 显示全部楼层
原帖由 bell6248 于 2009-12-11 16:49 发表


Try!

select a.fund_account,
       a.handling_charge,
       b.unwinding_profit,
       a.trade_sum,
       d.ljdwjz
  from (select fund_account,
               sum(handling_charge) handling_charge,
               sum(trade_sum) trade_sum
          from tb_deal_detail
         group by fund_account) a,
       (select t2.fund_account,
               sum(t1.unwinding_profit) unwinding_profit
          from tb_close t1, tb_unite t2
         where t2.id = t1.tb_unite_id
         group by t2.fund_account) b,
       (select fund_account,
               ljdwjz
          from (select fund_account,
                       ljdwjz,
                       id,
                       max(id) over(partition by fund_account) max_id
                  from tb_unite)
         where id = max_id) d
where a.fund_account = b.fund_account
  and a.fund_account = d.fund_account;


上面的执行计划没有变小,结果却是正确的. 因为 ID是tb_unite的主键.
2009-12-15_090248.jpg

使用道具 举报

回复

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

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

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