数据库sql去重操作 + 人大金仓案例

简介: 一般在增量导入数据后,表中会出现冗余的数据,因此对于表的去重操作主要分为两种:去重查询以及删除重复数据

背景:一般在增量导入数据后,表中会出现冗余的数据,因此对于表的去重操作主要分为两种:去重查询以及删除重复数据

1. 去重查询

1.1  distinct 关键字

selectdistinct<col1, col2, ...>from<table1>;

2. 删除重复数据

删除重复数据主要分为两种:部分去重和完全去重

2.1 部分去重

部分去重分为两个步骤:

2.1.1 找出重复数据

select<col1, col2, ...,count()>from<table1>groupby<col1, col2, ...>havingcount()>1;

2.1.2 删除临时数据

deletefrom<table1 a>where<col1, col2>in(select col1, col2, ...,count()from<table1>groupby col1, col2, ... 
havingcount()>1);

进阶:如果当数据量非常大的时候,上面的删除执行效率会非常低,甚至有可能导致数据库卡死,因此可以用临时表来减轻数据库io的压力

--创建临时表保存重复数据createtable tmp as(select<col1, col2, ...,count()>from<table1>groupby<col1, col2, ...>havingcount(*)>1);--删除原表中的重复数据deletefrom<table1 a>where(col1, col2, ...)in(select col1, col2, ...
from tmp);--删除临时表droptable tmp;

2.2 完全去重

当数据体量小的时候,可以考虑完全去重。

--创建临时表保存去重后的数据createtable tmp as(selectdistinct*from<table1>);--清空原表数据truncate table<table1>;--将临时表的数据插入到原表中insertinto<table1>(select*from tmp);--删除临时表droptable tmp;

3. 进阶用法

背景:如果数据10分钟导入一次,一小时导入一次,甚至一天导入一次,而且每次导入的数据都得进行去重,那么上述sql语句就会重复执行,我们如何实现其自动化?

答案是触发器,下面我写得一个应用触发器的事例,数据库用的是Kingbase(人大金仓V8),当然如果熟悉触发器的朋友也可以插入前检验,不过博主不擅长写referencing old old new new的前置触发,所以不在此举例。

CREATEOR REPLACE TRIGGER "clear_replica"--触发条件:当插入数据至LsvoFplnCmdcCoreItems表时会触发动作,也可以加其他触发条件比如 UPDATE, DELETE, 需用OR连接AFTER INSERTON LsvoFplnCmdcCoreItems
FOR EACH ROW
ASBEGIN--创建临时表保存重复数据CREATETABLE tmp AS(SELECT CompanyCode, BusinessTypeCode, SubBusinessTypeCode, SupplierCode, CurrencyCode, IsInit,  ExecAmt, PayDate, version
FROM LsvoFplnCmdcCoreItems
GROUPBY CompanyCode, BusinessTypeCode, SubBusinessTypeCode, SupplierCode, CurrencyCode, IsInit,  ExecAmt, PayDate, version 
HAVINGcount(*)>1);--删除原表中的重复数据deletefrom LsvoFplnCmdcCoreItems 
where(CompanyCode, BusinessTypeCode, SubBusinessTypeCode, SupplierCode, CurrencyCode, IsInit,  ExecAmt, PayDate, version)in(select CompanyCode, BusinessTypeCode, SubBusinessTypeCode, SupplierCode, CurrencyCode, IsInit,  ExecAmt, PayDate, version
from tmp);--删除临时表droptable tmp;END;
相关文章
|
10天前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
55 3
|
10天前
|
SQL 监控 数据库
SQL数据库还原详解:步骤、方法与实践指南c1b.0335pw.com
在现代信息技术的浪潮中,数据库管理系统(DBMS)已成为各类组织和企业不可或缺的核心组件。随着数据的不断积累和业务需求的日益增长,数据库的备份与还原成为了确保数据安全与业务连续性的重要手段。本文将深入探讨SQL数据库还原的各个方面,帮助读者理解并掌握数据库还原的核心概念、步骤和方法。一、数据库还原概
|
10天前
|
SQL 数据库 数据安全/隐私保护
SQL附加数据库出错的原因与解决方案3w9.0575cst.com
随着信息技术的不断发展,数据库已经成为了各行各业不可或缺的重要组成部分。而SQL作为最流行的数据库管理系统之一,其应用也越来越广泛。但在实际使用中,由于各种原因,我们可能会遇到SQL附加数据库出错的情况。本文将详细介绍SQL附加数据库出错的原因,以及相应的解决方案。一、SQL附加数据库出错的原因1.
|
6天前
|
SQL 存储 关系型数据库
mysql 数据库空间统计sql
mysql 数据库空间统计sql
19 0
|
10天前
|
SQL 存储 监控
串口调试助手连接SQL数据库的技巧与方法
串口调试助手是电子工程师和软件开发人员常用的工具,它能够帮助用户进行串口通信的调试和数据分析
|
10天前
|
SQL 存储 数据采集
如何把问卷录入SQL数据库
将问卷数据录入SQL数据库是一个涉及数据收集、处理和存储的过程
|
10天前
|
SQL 存储 关系型数据库
用SQL语句创建数据库:基础指南与操作示例4p7.0535yinshua.com
一、引言在当今数字化时代,数据库已成为各类应用的核心组成部分,用于存储、管理和检索大量数据。结构化查询语言(SQL)作为一种用于管理关系数据库系统的标准编程语言,广泛应用于数据库的创建、查询、更新和管理。本文将详细介绍如何使用SQL语句创建数据库,涵盖基本概念、操作步骤及常见示例,帮助读者快速掌握相
|
9天前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
44 6
|
7天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
40 3
Mysql(4)—数据库索引
|
9天前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
30 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用