news 2026/2/13 13:04:24

达梦数据库查重实战:多字段联合去重完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
达梦数据库查重实战:多字段联合去重完整指南

达梦数据库查重实战:多字段联合去重完整指南

今天在工作中处理了一个达梦数据库的查重需求,记录下解决方案,分享给可能遇到类似问题的朋友。

📋 问题背景

需要从UM_USERINFOAPPLY表中,根据USERINFO_CODE + GMT_MODIFIED两个字段的组合值进行查重。其中:

  • USERINFO_CODE:用户信息编码(字符串类型)

  • GMT_MODIFIED:修改时间(可能是时间类型或字符串类型)

🎯 核心挑战

两个字段直接拼接可能导致边界模糊,比如:

  • "ABC2023" + "01-01""ABC" + "202301-01"难以区分

  • 因此需要在两个字段之间添加分隔符

🔧 解决方案汇总

1.基础查重查询(推荐)

-- 添加空格分隔符,避免字段值边界模糊 SELECT CONCAT(USERINFO_CODE, ' ', GMT_MODIFIED) AS 组合字段, COUNT(*) AS 重复次数 FROM UM_USERINFOAPPLY GROUP BY CONCAT(USERINFO_CODE, ' ', GMT_MODIFIED) HAVING COUNT(*) > 1;

________________________________

-- 找出重复记录(用空格分隔)
SELECT
CONCAT(USERINFO_CODE, ' ', GMT_MODIFIED) AS combined_field,
COUNT(*) AS duplicate_count
FROM UM_USERINFOAPPLY
GROUP BY CONCAT(USERINFO_CODE, ' ', GMT_MODIFIED)
HAVING COUNT(*) > 1;

2.查看重复数据详情

-- 找出所有重复的详细记录 SELECT t1.* FROM UM_USERINFOAPPLY t1 INNER JOIN ( SELECT CONCAT(USERINFO_CODE, ' ', GMT_MODIFIED) AS combined_key FROM UM_USERINFOAPPLY GROUP BY CONCAT(USERINFO_CODE, ' ', GMT_MODIFIED) HAVING COUNT(*) > 1 ) t2 ON CONCAT(t1.USERINFO_CODE, ' ', t1.GMT_MODIFIED) = t2.combined_key ORDER BY CONCAT(t1.USERINFO_CODE, ' ', t1.GMT_MODIFIED);

3.处理时间类型字段

如果GMT_MODIFIED是时间类型,需要先转换:

SELECT CONCAT(USERINFO_CODE, ' ', TO_CHAR(GMT_MODIFIED, 'YYYY-MM-DD HH24:MI:SS')) AS 组合字段, COUNT(*) AS 重复次数 FROM UM_USERINFOAPPLY GROUP BY CONCAT(USERINFO_CODE, ' ', TO_CHAR(GMT_MODIFIED, 'YYYY-MM-DD HH24:MI:SS')) HAVING COUNT(*) > 1;

4.高效查重方案

-- 使用窗口函数,性能更好 WITH MarkedData AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY USERINFO_CODE, GMT_MODIFIED ORDER BY ROWID ) AS rn FROM UM_USERINFOAPPLY ) SELECT * FROM MarkedData WHERE rn > 1;

5.删除重复数据

-- 删除重复记录,只保留第一条 DELETE FROM UM_USERINFOAPPLY WHERE ROWID IN ( SELECT rid FROM ( SELECT ROWID AS rid, ROW_NUMBER() OVER ( PARTITION BY USERINFO_CODE, GMT_MODIFIED ORDER BY ROWID ) AS rn FROM UM_USERINFOAPPLY ) WHERE rn > 1 );

💡 关键技术点

1.字段连接技巧

  • 使用CONCAT(field1, ' ', field2)添加空格分隔

  • 或者使用field1 || ' ' || field2(达梦支持)

  • 关键:分隔符避免了字段值边界模糊问题

2.时间类型处理

  • 使用TO_CHAR()函数统一时间格式

  • 推荐格式:'YYYY-MM-DD HH24:MI:SS'

  • 确保时间比较的一致性

3.性能优化

  • 大数据量时创建临时索引:CREATE INDEX idx_temp ON table(field1, field2)

  • 使用ROW_NUMBER()窗口函数替代子查询

  • 查询后清理临时索引

📊 对比分析

方法优点缺点适用场景
CONCAT分组简单直观性能一般小数据量
窗口函数性能好,功能强语法稍复杂大数据量
JOIN查询可查看详情性能较差需要查看详情时
时间转换处理时间类型需要格式统一字段有时间类型时

🚀 最佳实践建议

  1. 预处理阶段:先确认字段类型,时间类型要先转换

  2. 分隔符选择:使用不常见的字符作为分隔符,如'||''##'

  3. 分步执行:先查询确认,再处理数据

  4. 备份优先:删除数据前务必备份或创建临时表

  5. 性能监控:大数据表添加临时索引提升性能

🎓 经验总结

  1. 字段连接查重的关键是确保组合键的唯一性和可读性

  2. 空格分隔符虽简单,但在大多数场景下足够使用

  3. 达梦数据库兼容标准SQL语法,但也有些Oracle特性

  4. 实际应用中,往往需要结合业务逻辑判断哪些字段需要联合去重

这个案例展示了数据库查重的常见处理模式,同样的思路也适用于其他数据库如MySQL、Oracle等,只是语法细节略有不同。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/10 2:54:50

学考赋能哪家优?泛微青蓝阁、考试星、酷学院、云学堂实力拆解

随着企业数字化人才培育进入“精准化、合规化”深水区,学习培训考试平台已从基础辅助工具,升级为企业搭建学练考闭环、赋能员工成长的核心载体。据《2026年企业学考数字化白皮书》显示,国内该领域市场规模已突破900亿元,AI赋能、合…

作者头像 李华
网站建设 2026/2/8 1:38:02

如何创建一个PR

第一阶段:本地准备 (在终端操作) 这几步是为了确保你的代码在本地是干净、准确地打包好的。 1. 确认身份 git branch 作用:查看当前所在的分支。 检查点:必须看到 * crj_develop(你的名字分支)是绿色的。 为什么&…

作者头像 李华
网站建设 2026/2/6 18:53:54

vue表格vxe-table 单元格拖拽复制填充功能,如何自定义某个列霍某个单元格禁止拖拽复制值,自定义扩展区域赋值方法

vue表格vxe-table 单元格拖拽复制填充功能,如何自定义某个列霍某个单元格禁止拖拽复制值,自定义扩展区域赋值方法。比如有很多列, 业务需要实现b列不能拖拽复制单元格值,c列允许拖拽复制单元格值。那么可以使用,自定义…

作者头像 李华
网站建设 2026/2/10 11:14:20

在腾讯 CloudStudio 上部署 Moltbot 接入钉钉完整教程

继《Moltbot 接入飞书》和《Moltbot 接入企业微信》后,本文将详细介绍如何将 Moltbot 接入钉钉,实现智能 AI 助手功能。钉钉官方已开源 Moltbot 连接器,让接入变得更加简单! 一、前期准备 1.1 所需资源清单 在开始部署之前,请确保准备好以下资源: ✅ 钉钉企业账号:需要企业管…

作者头像 李华