IT咨询顾问:group by与join引发的项目救火

简介: 我又一次进行了项目救火,这次的原因是group by与join胡乱的堆彻导致的整个业务系统审核流程发生严重的错误。基础的sql表关联,group by,子表都理不清,我也只能对你面带微笑,不想对你解析原因,你就按照我提供给你的模板改你全部的业务sql层(XML文件的sql)吧。

我又一次进行了项目救火,这次的原因是group by与join胡乱的堆彻导致的整个业务系统审核流程发生严重的错误。基础的sql表关联,group by,子表都理不清,我也只能对你面带微笑,不想对你解析原因,你就按照我提供给你的模板改你全部的业务sql层(XML文件的sql)吧。

 很简单的一对多表关联

用户表,customerId代表用户的唯一id,insertTime代表这条数据何时存入的。与之对应的是表单表,外键customerId表明这个保单是哪个客户的,同时unit表明出该保单的机构,insertTime也是插入时间。

 

业务背景

前端列表显示出每一天投保的客户信息(客户连续两天投保,则显示两条该客户数据,如上面intsmaze客户),点击每条记录的详情可以查看该客户当天的保单详情。

审核权限划分:一个客户一天投保的多个保单可能会来自多个出单机构,比如上面intsmaze,06-21的三个保单出自上海,北京,深圳,那么怎么划分,借助group by的"随缘法则",intsmaze 06-21号就取数据插入顺序最前的上海,特朗普 06-21 就取杭州。

他们的原产sql

SELECT * from customer c LEFT JOIN insurance i
on c.customerId=i.customerId and c.insertTime=i.insertTime
where c.flow='0'
GROUP BY c.customerId

查询的结果是两条数据,很显然少了一条intsmaze 06-22号的

 

虽然有问题,但是感觉很难爆出给用户的,它是怎么出现的了?

这要说审核流程了,默认数据进来是初审,用户表的flow是0。

当用户审核intsmaze的这一条数据后,数据变得如下

 我们可以看到flow='0'初审,intsmaze的unit由上海变成了北京,那是因为这条问题sql隐藏的数据终于出现了。

此时flow='1'复审的数据如下

然后有趣的事情来了,审核人员此时又将初审的intsmaze 北京 提交到复审,这个时候复审应该有两条数据,但是他到复审那里还是就看到一条数据。然后就出大事了,最后我就马革裹尸过来救火了。

解决方案

join的时候是几个字段,group by就几个字段,加上insertTime即可

SELECT * from customer c LEFT JOIN insurance i
on c.customerId=i.customerId and c.insertTime=i.insertTime
GROUP BY c.customerId,c.insertTime

unit判断,导致同一条数据两个机构均可审核

他的unit的判断放在join后的where条件上

SELECT * from customer c LEFT JOIN insurance i
on c.customerId=i.customerId and c.insertTime=i.insertTime
where c.flow='1' and i.unit='北京'
GROUP BY c.customerId

这导致一个有趣的问题就是,比如intsmaze 06-21 这个客户,它分别能被北京,上海,深圳三个机构看到,其他机构是看不到。然后就出现一个有趣的现象:"谁动了我的数据,我明明没有审核,为什么到复审了,北京复审页面看到这条数据初审提交人事上海,这是怎么一回事嘛?"。

这个问题我只显示结果,不想解释,最后附上解决方案。

SELECT * from customer c LEFT JOIN insurance i
on c.customerId=i.customerId and c.insertTime=i.insertTime
where c.flow='1'
GROUP BY c.customerId

这个客户本来是该上海机构去审核

可是我发现,如果北京机构人登录,也是可以看到这条记录进行审核

SELECT * from customer c LEFT JOIN insurance i
on c.customerId=i.customerId and c.insertTime=i.insertTime
where c.flow='1' and i.unit='北京'
GROUP BY c.customerId

如何解决,子表呗

SELECT * from (
SELECT c.customerId,c.insertTime,unit,money from customer c LEFT JOIN insurance i
on c.customerId=i.customerId and c.insertTime=i.insertTime
where c.flow='1' 
GROUP BY c.customerId
)temp 
where temp.unit='北京'

最终我提供的sql模板如下:

SELECT * from (
SELECT c.customerId,c.insertTime,unit,money from customer c LEFT JOIN insurance i
on c.customerId=i.customerId and c.insertTime=i.insertTime
where c.flow='1'
GROUP BY c.customerId,c.insertTime
)temp where temp.unit='北京'

模板提供后,剩下的事情当然不是我去改了,毕竟我已经吐了几口血了。我只负责找出问题,提供解决方案,然后功能顾问就全方位的改自己的sql。我则一旁陪伴直至改完后,系统没有出现他们无法解决的毛病后就离场修身养性咯。

 

ps:救了几次火后,我晓得当初为什么我被面试,别人问我你开发中遇到什么奇怪的bug没,我当时真的没有啊,我确实没有遇到什么奇怪的bug,因为你如果真的按照语法规则开发,其实很多问题都是不会出现的。之所以会出现,往往是基础太薄弱,然后也不理解上来就模仿,然后就会出错。

 

作者: intsmaze(刘洋)
老铁,你的--->推荐,--->关注,--->评论--->是我继续写作的动力。
微信公众号号:Apache技术研究院
由于博主能力有限,文中可能存在描述不正确,欢迎指正、补充!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章
|
Web App开发 数据管理 定位技术
合工大现代企业管理期末报告--阿里巴巴企业管理模式探究
合工大现代企业管理期末报告--阿里巴巴企业管理模式探究
185 0
合工大现代企业管理期末报告--阿里巴巴企业管理模式探究
|
SQL 数据采集 存储
Amundsen在REA Group公司的应用实践
Amundsen在REA Group公司的应用实践
209 0
Amundsen在REA Group公司的应用实践
|
Rust 数据可视化 安全
95后百度员工对领导不满,删改公司数据库被判刑;微软在美取消竞业协议;TikTok中国管理团队与海外员工冲突引发离职潮 |Q资讯
95 后百度员工因项目被接手对领导不满,刻意删改公司数据库被判刑;微软宣布在美国停止执行员工竞业协议;字节跳动员工“秘密”入职快手,被判返赔近 38 万;特斯拉将裁员 1 万人、暂停全球招聘,马斯克回应:裁员不涉及实际生产人员,还将增加小时工;TikTok 中国管理团队与英国员工发生矛盾冲突,众多员工离职,涉事高管被停职调查;蚂蚁集团:目前没有启动 IPO 的计划;无视微软反对,美商务部限制中美网络安全合作;GitHub Atom 将停用,6 个月后完成归档......
270 0
|
前端开发 C++
回答一位朋友关于 SAP SRM 行业 转 CRM 行业的咨询
回答一位朋友关于 SAP SRM 行业 转 CRM 行业的咨询
|
存储 运维 Kubernetes
【Offer5000-基础产品事业部1】- 招聘职位详情
阿里云智能云原生应用平台负责服务阿里集团,并面向行业客户承担加速企业数字化转型升级,推动核心技术互联网化演进的责任,帮助企业客户和开发者全面拥抱云计算、最大化发挥云计算的价值、享受云计算的红利。团队本次招聘岗位4个:1、云原生研发Leader ;2、 Serverless研发专家;3、容器平台技术专家;4、Serverless基础平台研发专家。
4483 0
【Offer5000-基础产品事业部1】- 招聘职位详情
|
存储 运维 前端开发
【Offer 5000-基础产品事业部2-B】- 招聘职位详情
阿里云混合云团队责基础产品中的混合云存储产品,致力于研发混合云存储,分布式软件定义存储,灾备以及数据管理产品,依托遍布全球的阿里云基础设施,构筑安全,可靠,高效的混合云存储系统,助力企业客户数字化转型。团队本次招聘岗位3个:1、混合云存储管控开发专家;2、混合云存储数据面开发专家;3、混合云存储测试和交付技术专家/高级技术专家。
2925 0
【Offer 5000-基础产品事业部2-B】- 招聘职位详情
|
机器学习/深度学习 人工智能 算法
【Offer 5000-基础设施事业部】- 招聘职位详情
基础设施事业部本次招聘岗位4个:1、 AI/HPC/BigData大计算类基础设施高级产品专家;2、 AI大数据高性能计算领域业务架构师;3、大计算机群性能专家;4、服务及技术支持专家 。
3419 0
【Offer 5000-基础设施事业部】- 招聘职位详情
|
缓存 负载均衡 Cloud Native
【Offer 5000-流量产品事业部】- 招聘职位详情
流量产品事业部本次招聘岗位5个:1、 CDN调度研发专家;2、 CDN点播研发专家;3、 CDN节点系统研发专家 ;4数据研发专家 ;5、管控平台研发专家 。
2427 0
【Offer 5000-流量产品事业部】- 招聘职位详情
|
SQL 分布式计算 Kubernetes
【Offer 5000-计算平台事业部-B】- 招聘职位详情
阿里云实时计算部是阿里巴巴大数据技术体系的核心团队,围绕Apache Flink为核心打造的大数据实时计算平台。团队本次 招聘岗位2个:1、大数据实时计算研发专家 ;2、大数据开放平台研发专家
1958 0
【Offer 5000-计算平台事业部-B】- 招聘职位详情
|
Oracle Java 大数据
【Offer 5000-计算平台事业部-A】- 招聘职位详情
在这里, 你将和Dataworks云产品团队一起, 整合阿里云海量异构存储元数据, 统一各计算引擎调度, 构建元数据中台, 提供业界领先的大数据综合治理, 数据湖, 数据服务的能力。团队本次招聘岗位3个:1、 java开发 ;2、 Java 技术专家2名 ;3、前端开发专家 。
2610 0
【Offer 5000-计算平台事业部-A】- 招聘职位详情