ORACLE组合条件实例

本文最后更新于: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 目标表 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.担保合同编号);

ORACLE组合条件实例
https://www.chaierss.online/posts/58475bac.html
作者
Chaierss
发布于
2024年9月30日
许可协议