实战
ORACLE组合条件实例 2024-09-30 更新于 2025-10-03 约 3 分钟 · 763 字
#Oracle
前言 在日常工作中,客户提出了某些需求,如何运用组合条件满足这些需求呢?
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 目标表 A SET 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.担保合同编号);