SQL需求:按Client_Name筛选记录,避免重复添加同一客户数据
需求分析与SQL解决方案
原表INPUTPF结构及数据
| 记录编号 | 客户名称 | 类别 | Fld1 | Fld2 |
|---|---|---|---|---|
| 1 | Abbey | 123 | Y | |
| 2 | Abbey | 999 | Y | |
| 3 | Abbey | 234 | Y | |
| 4 | Bill | 222 | N | |
| 5 | Bill | 333 | Y | N |
| 6 | Bill | 444 | Y | N |
| 7 | Mike | 987 | Y | N |
| 8 | Mike | 000 | Y | N |
| 9 | Mike | 999 | ||
| 10 | Tom | 666 | Y | N |
| 11 | Tom | 777 | Y | N |
| 12 | Tom | 999 | Y |
原有SQL逻辑
原有SQL用于筛选Fld1存在差异的客户所有记录并写入OUTPUT1:
DROP TABLE IF EXISTS OUTPUT1; CREATE TABLE LIB1/OUTPUT1 AS( SELECT * FROM INPUTPF WHERE Client_Name IN ( SELECT Client_Name FROM INPUTPF GROUP BY Client_Name HAVING COUNT(DISTINCT Fld1) > 1 ) ) WITH DATA;
该代码已将Bill(记录4-6)和Mike(记录7-9)的所有记录写入OUTPUT1。
新需求
需要补充SQL,实现:
- 检测INPUTPF中Fld2存在差异的客户记录
- 仅将未因Fld1差异被写入OUTPUT1的客户(如Tom)的所有记录添加至OUTPUT1
- 已存在于OUTPUT1的客户(如Mike),即使Fld2有差异也不重复添加
- 最终OUTPUT1需包含Bill、Mike、Tom的所有对应记录且无重复
解决方案SQL
使用INSERT INTO结合条件筛选即可实现需求,代码如下:
INSERT INTO LIB1/OUTPUT1 SELECT * FROM INPUTPF WHERE Client_Name IN ( -- 筛选Fld2存在差异的客户 SELECT Client_Name FROM INPUTPF GROUP BY Client_Name HAVING COUNT(DISTINCT Fld2) > 1 ) -- 排除已在OUTPUT1中的客户,避免重复插入 AND Client_Name NOT IN ( SELECT DISTINCT Client_Name FROM LIB1/OUTPUT1 );
逻辑说明
- 第一个内层子查询:筛选出所有Fld2存在不同值(包含空值)的客户
- 第二个内层子查询:获取已经存在于OUTPUT1中的客户名单
- 主查询从INPUTPF中选取满足「Fld2有差异且未在OUTPUT1中」的客户所有记录,插入到OUTPUT1中
执行后,Tom的所有记录会被添加到OUTPUT1,而Bill、Mike的记录不会重复插入,最终OUTPUT1将包含所有目标客户的完整记录。
内容的提问来源于stack exchange,提问作者TommyV
相关产品推荐
相关产品推荐

