`
felixsky
  • 浏览: 7223 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类

通过SQL保留数据库表中的唯一一行重复数据

 
阅读更多

在项目开发和维护过程中,经常会遇到数据库中存在重复数据,由此带来一系列的问题。于是“如何删除重复数据,并保留重复数据的一条记录”这样的需求就会经常在工作中遇到。而每次遇到这样的问题总是要重新整理sql,今天再次遇到这样的问题,决定还是记录下来,方便以后查阅。

 

目前工作的数据库是SQL Server 2008, 所以该方案只针对SQL Server有效。

大致思路: 通过Rank函数对可能存在重复值的columns进行分块Ranking (如下表)。随后对rank值大于1的记录进行删除。

ProductID   Name                   LocationID   Quantity Rank
----------- ---------------------- ------------ -------- ----
494         Paint - Silver         3            49       1
495         Paint - Blue           3            49       1
493         Paint - Red            3            41       3
496         Paint - Yellow         3            30       4
492         Paint - Black          3            17       5
495         Paint - Blue           4            35       1
496         Paint - Yellow         4            25       2
493         Paint - Red            4            24       3
492         Paint - Black          4            14       4
494         Paint - Silver         4            12       5

大致的SQL 如下:

 

alter table tableName add  sno int identity(1,1)
delete from tableName where sno in
(
	select sno from (
		select *,
		RANK() OVER ( PARTITION BY empid,name ORDER BY sno DESC )rank
		From tableName
	)T
	where rank>1
)
ALTER TABLE tableName DROP COLUMN sno

 当然还有其他方法,诸如通过临时表之类的,下次用到再补充。

 

针对Oracle,可以通过rowid来实现相同的功能,示例如下:

DELETEFROM table WHERE rowid notin(SELECT MIN(rowid)FROM table GROUPBY column1, column2, column3);

分享到:
评论

相关推荐

    MySQL根据某一个或者多个字段查找重复数据的sql语句

    sql 查出一张表中重复的所有记录数据 1.表中有id和name 两个字段,查询出name重复的所有数据 select * from xi a where (a.username) in (select username from xi group by username having count(*) > 1) 2、...

    删除数据库中重复的数据(只保留一条)

    删除数据库中重复的数据!! 详细SQL语句....

    达梦数据库_SQL语言手册

    达梦数据库_SQL语言手册.pdf 数据库快照定义语句 数据库快照删除语句 第章数据查询语句和全文检索语句 单表查询 简单查询 带条件查询 集函数 情况表达式 连接查询 子查询 标量子查询 表子查询 派生表子...

    SQL语句删除数据表中重复的记录

    该文档是本人在实验过程中遇到的一个需求,之后解决了,特此写一个文档,实现一条SQL语句删除数据库某一个表中重复的记录。(重复的记录只保留一条,其他的被删除)

    sqlserver清除完全重复的数据只保留重复数据中的第一条

    根据autoID删除临时表#tmp中的重复数据,只保留每组重复数据中的第一条

    Oracle数据库、SQL

    1.1表是数据库中存储数据的基本单位 1 1.2数据库标准语言 1 1.3数据库(DB) 1 1.4数据库种类 1 1.5数据库中如何定义表 1 1.6 create database dbname的含义 1 1.7安装DBMS 1 1.8宏观上是数据-->database 1 1.9远程...

    精通SQL--结构化查询语言详解

    第1章 数据库与sql基础 1 1.1 数据库的基本概念 1 1.1.1 数据库的由来 1 1.1.2 数据库系统的概念 3 1.2 数据库系统的结构、组成及工作流程 3 1.2.1 数据库的体系结构 3 1.2.2 数据库系统的组成 4 1.2.3 ...

    MySQL查询重复数据(删除重复数据保留id最小的一条为唯一数据)

    最近在做一个批量数据导入到MySQL数据库的功能,从批量导入就可以知道,这样的数据在插入数据库之前是不会进行重复判断的,因此只有在全部数据导入进去以后在执行一条语句进行删除,保证数据唯一性。 下面话不多说了...

    精通SQL 结构化查询语言详解

    《精通SQ:结构化查询语言详解》全面讲解SQL语言,提供...附录A SQL保留字  附录B 常用的SQL命令  附录C 关于运行环境的说明  C.1 SQL Server 2000  C.1.1 直接访问  C.1.2 从企业管理器访问 C.2 Oracle系统

    SQL Server 数据库实用SQL语句

    –查看指定表的外键约束 select * from sysobjects ...delete news where patindex(‘%[0-9]%’,title)>0 –删除删去 字段 title值重复的行,且只保留 id 较小的这个 delete news where exists(select 1 from news t

    数据自动备份系统(数据库+文件备份)【delphi源码】

    二、 系统介绍 1. 系统简介 软件可自动完成SQL Server数据库和文档的数据定时自动备份,由用户选择对哪些数据库或文档进行数据备份,提供对备份、还原数据作业的管理、分析、日志跟踪等功能。...

    Oracle数据库实验操作

    实验1:书写一个最简单的sql语句,查询一张表的所有行和所有列 9 实验2:查询一张表的所有行,但列的顺序我们自己决定 10 实验3:查询表的某些列,在列上使用表达式 10 实验4:使用sqlplus,进入sqlplus并进行简单的...

    Access 2000数据库系统设计(PDF)---025

    1044.11.2 改变字段数据类型和大小 1054.11.3 改变表之间的关系 1064.12 复制和粘贴表 1074.13 疑难解答 1084.14 现实世界—数据库战略和表战术 108第5章 输入、编辑和验证表中的数据 1105.1 在Access表中输入测试...

    经典全面的SQL语句大全

     UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1...

    SQL语法大全

    sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表) (5) 数据记录统计函数: AVG(字段名) 得出一个表格栏平均值 COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据...

    [详细完整版]8数据库.doc

    A、 数据和数据之间没有联系 B、数据有丢失 C、 数据量太大 D、存在重复的数据 14、关系数据库中的关键字段是指( ) A、能唯一决定关系的字段 B、不可改动的专用保留字 C、关键的很重要的字段 D、能唯一标识元组的...

    Access 2000数据库系统设计(PDF)---002

    1044.11.2 改变字段数据类型和大小 1054.11.3 改变表之间的关系 1064.12 复制和粘贴表 1074.13 疑难解答 1084.14 现实世界—数据库战略和表战术 108第5章 输入、编辑和验证表中的数据 1105.1 在Access表中输入测试...

    Access 2000数据库系统设计(PDF)---018

    1044.11.2 改变字段数据类型和大小 1054.11.3 改变表之间的关系 1064.12 复制和粘贴表 1074.13 疑难解答 1084.14 现实世界—数据库战略和表战术 108第5章 输入、编辑和验证表中的数据 1105.1 在Access表中输入测试...

    Access 2000数据库系统设计(PDF)---003

    1044.11.2 改变字段数据类型和大小 1054.11.3 改变表之间的关系 1064.12 复制和粘贴表 1074.13 疑难解答 1084.14 现实世界—数据库战略和表战术 108第5章 输入、编辑和验证表中的数据 1105.1 在Access表中输入测试...

Global site tag (gtag.js) - Google Analytics