查看: 11931|回复: 41

【话题讨论】有场景有数据,采纳者赠送全部pub币,速进

[复制链接]
招聘 : Oracle 课程老师
论坛徽章:
48
19周年集字徽章-周
日期:2019-09-03 17:47:002011数据库大会纪念章
日期:2015-04-23 10:33:192010数据库技术大会纪念徽章
日期:2015-04-23 10:33:192014年世界杯参赛球队: 俄罗斯
日期:2014-07-17 17:21:42ITPUB伯乐
日期:2014-07-17 14:45:422014年世界杯参赛球队: 希腊
日期:2014-06-20 16:01:122014年世界杯参赛球队:克罗地亚
日期:2014-06-12 16:53:56马上加薪
日期:2014-04-25 14:18:13目光如炬
日期:2014-04-21 06:00:12马上有房
日期:2014-03-31 15:10:37
跳转到指定楼层
1#
发表于 2014-6-17 15:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
场景:有3张金融表,求出符合要求的结果集,已有SQL,请教能否在优化,采纳者赠送全部pub币!

合同金额表 finances_sum
IID主键  COPERATIONID合同业务ID  CURRENCYKINDCODE币种   validityflag数据有效状态标志
183      61                                    ENU                                2
184      62                                    CNY                                2
185      62                                    CNY                                1
186      62                                    ENU                                1
187      61                                    CNY                                1
188      61                                    ENU                                1
189      60                                    CNY                                1
190      59                                    CNY                                1
191      58                                    CNY                                1
192      57                                    CNY                                1

合同表  finances_con
IID主键  COPERATIONID合同业务ID  contractinuredate合同生效日期  contractpausedate合同终止日期  validityflag数据有效状态标志
200      62                                    2014-1-1                                2014-12-31                              1
201      61                                    2014-1-1                                2014-12-31                              1
202      60                                    2014-1-1                                2014-12-31                              1
203      59                                    2014-1-1                                2014-12-31                              1
204      58                                    2014-1-1                                2014-12-31                              1
205      57                                    2010-3-8                                2010-5-8                                  1

合同租金表  finances_ren
IID主键  COPERATIONID合同业务ID  RENTALSUM本期实还金额  validityflag数据有效状态标志
298      61                                    500000                           2
299      62                                    500000                           2
300      62                                    500000                           1
301      62                                    400000                           1
302      62                                    300000                           1
303      61                                    500000                           1
304      61                                    400000                           1               
305      61                                    300000                           1   
306      60                                     50                                  1
307      60                                     40                                  1               
308      60                                     30                                  1            
309      59                                     300000                          1
310      59                                     200000                          1
311      59                                     100000                          1
312      58                                     400000                          1
313      58                                     10000                            1
314      58                                     10000                            1
315      57                                     500                                1
316      57                                     400                                1
317      57                                     300                                1
318      57                                     100                                1

【问】
想得到的一个结果集,前4个字段是合同金额表finances_sum的,后2个字段是合同表finances_con的,最后1个字段是合同租金表finances_ren的
IID主键  COPERATIONID合同业务ID  CURRENCYKINDCODE币种  validityflag数据有效状态标志  contractinuredate合同生效日期  contractpausedate合同终止日期  MAX(RENTALSUM本期实还金额)
185      62                                    CNY                               1                                      2014-1-1                                 2014-12-31                             500000
186      62                                    ENU                               1                                      2014-1-1                                 2014-12-31                             500000
187      61                                    CNY                               1                                      2014-1-1                                 2014-12-31                             500000
188      61                                    ENU                               1                                      2014-1-1                                 2014-12-31                             500000
189      60                                    CNY                               1                                      2014-1-1                                 2014-12-31                             50
190      59                                    CNY                               1                                      2014-1-1                                 2014-12-31                             300000
191      58                                    CNY                               1                                      2014-1-1                                 2014-12-31                             400000
192      57                                    CNY                               1                                      2010-3-8                                 2010-5-8                                 500

【答】
根据上述要求,分2条语句来实现
第1条SQL,前6个字段结果集,涉及到合同金额表finances_sum和合同表finances_con
select a.*,b.contractinuredate,b.contractpausedate from finances_sum a,finances_con b where a.validityflag = 1 and a.coperationid=b.coperationid;
IID主键  COPERATIONID合同业务ID  CURRENCYKINDCODE币种   validityflag数据有效状态标志  contractinuredate合同生效日期  contractpausedate合同终止日期
185      62                                    CNY                                 1                                      2014-1-1                               2014-12-31
186      62                                    ENU                                 1                                      2014-1-1                               2014-12-31
187      61                                    CNY                                 1                                      2014-1-1                               2014-12-31
188      61                                    ENU                                 1                                      2014-1-1                               2014-12-31
189      60                                    CNY                                 1                                      2014-1-1                               2014-12-31
190      59                                    CNY                                 1                                      2014-1-1                               2014-12-31
191      58                                    CNY                                 1                                      2014-1-1                               2014-12-31
192      57                                    CNY                                 1                                      2010-3-8                               2010-5-8

第2条SQL,后面求“在合同业务ID中本期实还金额最大的记录”,涉及到合同租金表finances_ren
select coperationid,max(rentalsum) from finances_ren where validityflag =1 group by coperationid;
IID主键  COPERATIONID合同业务ID  RENTALSUM本期实还金额  validityflag数据有效状态标志
300      62                                      500000                            1
303      61                                      500000                            1
306      60                                      50                                    1         
309      59                                      300000                            1
312      58                                      400000                            1
315      57                                      500                                  1

【终问】现在想把上述这2条SQL合并成1条SQL来实现,具体如何操作

重现问题脚本(包括建表和插入数据代码)
test_script.sql (6.78 KB, 下载次数: 44)           请点击下载





18#苏上人 SQL执行结果报错,请见下图, group by a.*  (不能有星符吧)







论坛徽章:
314
行业板块每日发贴之星
日期: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
2#
发表于 2014-6-17 15:28 | 只看该作者
盛哥,到开发版发帖,那里的大师SQL优化水平更高,

使用道具 举报

回复
论坛徽章:
0
3#
发表于 2014-6-17 15:28 | 只看该作者
在最后加个相关子查询就可以了吧,select a.* ,(select max(rentalsum) from finances_ren c where validityflag =1 and c.coperationid=a.coperationid) from xxx a;

使用道具 举报

回复
论坛徽章:
40
2014年新春福章
日期:2014-02-18 16:43:09喜羊羊
日期:2015-05-18 16:24:25慢羊羊
日期:2015-06-12 13:08:22暖羊羊
日期:2015-07-02 16:06:20暖羊羊
日期:2015-07-06 16:28:55狮子座
日期:2015-07-29 17:14:43摩羯座
日期:2015-09-02 13:58:47白羊座
日期:2015-09-08 10:39:06天枰座
日期:2015-09-17 21:41:53摩羯座
日期:2015-10-29 21:07:02
4#
发表于 2014-6-17 15:43 | 只看该作者
select a.*,b.contractinuredate,b.contractpausedate,c.rentalsum
from finances_sum a,finances_con b,
   (select coperationid,max(rentalsum) rentalsum from finances_ren where validityflag =1 group by coperationid) c
where a.validityflag = 1 and a.coperationid=b.coperationid
    and a.coperationid=c.coperationid;

使用道具 举报

回复
论坛徽章:
91
秀才
日期:2015-11-02 11:24:03秀才
日期:2017-12-12 10:00:50秀才
日期:2017-09-18 17:34:47秀才
日期:2017-09-18 17:02:592017金鸡报晓
日期:2017-02-08 14:09:132017金鸡报晓
日期:2017-01-10 15:39:05秀才
日期:2016-12-21 16:55:07ITPUB15周年纪念
日期:2016-10-06 10:54:102016猴年福章
日期:2016-02-23 09:58:342016猴年福章
日期:2016-02-18 09:31:30
5#
发表于 2014-6-17 18:06 | 只看该作者
盛哥,去开发板吧,有newkid大师在,还有兔子等人,绝对靠谱,newkid正好后半夜上线。

使用道具 举报

回复
论坛徽章:
0
6#
发表于 2014-6-17 18:50 | 只看该作者
顶一顶

使用道具 举报

回复
论坛徽章:
5
ITPUB十周年纪念徽章
日期:2011-11-01 16:26:29鲜花蛋
日期:2011-12-30 16:11:222012新春纪念徽章
日期:2012-01-04 11:57:562015年新春福章
日期:2015-03-04 14:53:162015年新春福章
日期:2015-03-06 11:58:39
7#
发表于 2014-6-17 20:00 | 只看该作者
两个 sql通过 ,coperationid 关联 起来。

使用道具 举报

回复
论坛徽章:
57
SQL极客
日期:2013-12-09 14:13:35秀才
日期:2016-01-21 13:42:39秀才
日期:2016-01-13 12:14:26SQL大赛参与纪念
日期:2016-01-13 10:32:19SQL数据库编程大师
日期:2016-01-13 10:30:43秀才
日期:2015-12-14 14:47:54秀才
日期:2015-10-19 15:50:392015年新春福章
日期:2015-03-06 11:58:18懒羊羊
日期:2015-03-04 14:52:11优秀写手
日期:2014-11-08 06:00:14
8#
发表于 2014-6-17 21:10 | 只看该作者
你三个表数据量各多大,索引情况如何?
其实你第一个sql和第二个sql根据合同号关联就能合并,但是优化得看你的sql数据量,索引什么的

使用道具 举报

回复
论坛徽章:
57
SQL极客
日期:2013-12-09 14:13:35秀才
日期:2016-01-21 13:42:39秀才
日期:2016-01-13 12:14:26SQL大赛参与纪念
日期:2016-01-13 10:32:19SQL数据库编程大师
日期:2016-01-13 10:30:43秀才
日期:2015-12-14 14:47:54秀才
日期:2015-10-19 15:50:392015年新春福章
日期:2015-03-06 11:58:18懒羊羊
日期:2015-03-04 14:52:11优秀写手
日期:2014-11-08 06:00:14
9#
发表于 2014-6-17 21:13 | 只看该作者
xgghxkhuang 发表于 2014-6-17 21:10
你三个表数据量各多大,索引情况如何?
其实你第一个sql和第二个sql根据合同号关联就能合并,但是优化得看 ...

当你第一个结果集过滤出来足够小第二个上面有索引可以用相关子查询,否则先聚合再链接也行,你得看如何做能尽快过滤掉数据

使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
10#
发表于 2014-6-17 21:26 | 只看该作者
lz,全部pub币有多少啊

使用道具 举报

回复

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

本版积分规则 发表回复

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