本文最后更新于:2 年前
前言 在日常工作中,客户提出了某些需求,如何运用组合条件满足这些需求呢?
1.需求分析 客户需求如下:一个担保合同对应多个担保物时,只需要保留一个,手工调整太累了,能不能改成自动。
需求分析如下:
一个担保合同对应多个担保物时,条件筛选只保留一个担保金额
显而易见的,1:N的情况下造成N条数据,即多个担保物共享一个担保金额。
2.思路想法 不是重复数据的问题,采用UPDATE更新。根据需求分析确定思路如下。
1.先找出一个担保合同对应多个担保物的担保 2.确定保留哪一个(客户沟通,保留一个最早的)
3.明细实现 思路明确之后就是具体实现。
1.先找出一个担保合同对应多个担保物的担保 一个简单的分组后筛选
1 SELECT 担保合同编号 FROM 担保合同信息表 GROUP BY 担保合同编号 HAVING COUNT (*) > 1
2.确定保留哪一个(客户沟通,保留一个最早的) 最早运用MIN()函数
1 2 3 4 SELECT MIN (担保合同编号) FROM 担保合同信息表WHERE 担保合同编号 IN (SELECT 担保合同编号 FROM 担保合同信息表 GROUP BY 担保合同编号 HAVING COUNT (* ) > 1 )
3.组合条件UPDATE更新 1 2 3 4 5 6 7 8 9 10 11 UPDATE 目标表SET 目标表担保合同金额 = 0 WHERE 担保合同编号 IN (SELECT 担保合同编号 FROM 担保合同信息表 GROUP BY 担保合同编号 HAVING COUNT (*) > 1 )AND 担保合同编号 NOT IN (SELECT MIN (担保合同编号) FROM 担保合同信息表WHERE 担保合同编号 IN (SELECT 担保合同编号 FROM 担保合同信息表 GROUP BY 担保合同编号 HAVING COUNT (*) > 1 ));
4.调整完善 当然要考虑到语句的运行效率优化,关于sql优化—in和exists效率问题,笔者建议另作一篇文章讨论,此处引用优化结论:
如果查询的两个表大小相当,那么用in 和exists 差别不大。 如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in
优化后语句如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 UPDATE 目标表 ASET A.目标表担保合同金额 = 0 WHERE EXISTS ( SELECT B.担保合同编号 FROM 担保合同信息表 B WHERE A.担保合同编号 = B.担保合同编号 GROUP BY B.担保合同编号)AND NOT EXISTS ( SELECT MIN (C.担保合同编号) FROM 担保合同信息表 C WHERE EXISTS ( SELECT B.担保合同编号 FROM 担保合同信息表 B WHERE C.担保合同编号 = B.担保合同编号 GROUP BY B.担保合同编号) AND A.担保合同编号 = C.担保合同编号);