数据库删除完全重复和部分关键字段重复的记录

1、第一种重复很容易解决,不同数据库环境下方法相似:

以下为引用的内容:
Mysql

create table tmp select distinct * from tableName;

drop table tableName;

create table tableName select * from tmp;

drop table tmp;

SQL Server

select distinct * into #Tmp from tableName;

drop table tableName;

select * into tableName from #Tmp;

drop table #Tmp;

Oracle

create table tmp as select distinct * from tableName;

drop table tableName;

create table tableName as select * from tmp;

drop table tmp;

发生这种重复的原因是由于表设计不周而产生的,增加唯一索引列就可以解决此问题。

2、此类重复问题通常要求保留重复记录中的第一条记录,操作方法如下。 假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

Mysql

以下为引用的内容:
alter table tableName add autoID int auto_increment not null;

create table tmp select min(autoID) as autoID from tableName group by Name,Address;

create table tmp2 select tableName.* from tableName,tmp where tableName.autoID = tmp.autoID;

drop table tableName;

rename table tmp2 to tableName;

SQL Server

select identity(int,1,1) as autoID, * into #Tmp from tableName;

select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,Address;

drop table tableName;

select * into tableName from #Tmp where autoID in(select autoID from #Tmp2);

drop table #Tmp;

drop table #Tmp2;

Oracle

DELETE FROM tableName t1 WHERE t1.ROWID > (SELECT MIN(t2.ROWID) FROM tableName t2 WHERE t2.Name = t1.Name and t2.Address = t1.Address);

说明:

1. MySQL和SQL Server中最后一个select得到了Name,Address不重复的结果集(多了一个autoID字段,在大家实际写时可以写在select子句中省去此列)

2. 因为MySQL和SQL Server没有提供rowid机制,所以需要通过一个autoID列来实现行的唯一性,而利用Oracle的rowid处理就方便多了。而且使用ROWID是最高效的删除重复记录方法。

(0)

相关推荐

  • MyEclipse连接MySQL数据库图文教程

    自己在自学JavaEE课程时,在做一些小东西的时候,需要连接MySQL数据库,自己看了看书,然后自己摸索,一步步成功,学习也是一个分享的过程,图文结合,希望帮助到更多的人. 一.配置Database Explorer1. 打开MyEclipse Database. 方法:Window-->Openperspective-->MyEclipse Database Explorer 2.点击右上角的MyEclipse...在DB Browser空白处单击右键-->new 打开DataBase

  • 记一次mariadb数据库无法连接

    自从自己维护blog以后,基本一个月内,都会出现1,2次这种错误,以前解决的办法很简单,就是把虚拟机重启一下就可以.经常是网友在微信,qq,微博提醒我blog挂掉. 刚好国庆期间碰上,就顺便提高一下自己的运维能力,看看具体的原因. tail /var/log/mariadb/mariadb.log 看到大概的错误 161004 11:21:05 InnoDB: Fatal error: cannot allocate memory for the buffer pool 161004 11:21

  • python爬取NUS-WIDE数据库图片

    实验室需要NUS-WIDE数据库中的原图,数据集的地址为http://lms.comp.nus.edu.sg/research/NUS-WIDE.htm   由于这个数据只给了每个图片的URL,所以需要一个小爬虫程序来爬取这些图片.在图片的下载过程中建议使用VPN.由于一些URL已经失效,所以会下载一些无效的图片. # PYTHON 2.7 Ubuntu 14.04 nuswide = "$NUS-WIDE-urls_ROOT" #the location of your nus-wi

  • 利用SQL Server数据库邮件服务实现监控和预警

    背景 现在越来越多的企业.公司要求对于数据库实现7*24小时的数据库监控,一般情况下采用的就是第三方的平台来实现邮件和手机短信的监测提醒.前几日公司新上了一台服务器,急于部署程序还没来得及搭建其他相关平台,为了更好的监控数据库,暂时用SQL Server自带的邮件服务来实现对数据库的监控和预警.下面简要介绍下配置的过程便于以后使用. 配置邮件 整个部分的核心就是配置邮件服务,这部分需要一个邮件账户以及相应的邮件服务器.下面就以QQ的邮件为例进行说明. 1.设置邮件服务器 开启SMTP服务,点击开

  • Linux 自动备份oracle数据库详解

    Linux 自动备份oracle数据: 曾经有个同事,来回操作开发和生产的数据库,结果误删了生产的数据库,那种心情我想不是一般人能理解的,虽然说oracle可以有方法还原,但并不是彻底的. 所以,在工作中,不管是开发还是维护,备份数据库是非常有必要. 简单实用的晚间自动备份数据库小案例 步骤一.创建备份脚本,暂且命名为orabak.sh #路径名,指定备份的路径 FILEPATH = /oracle/orabak #根据指定日期格式,定义备份数据库文件名 FILENAME = `date + %

  • Access数据库中“所有记录中均未找到搜索关键字”的解决方法

    先使用 Ms Access 压缩修复,然后再去相关的表把备注类型的字段里的"索引"去掉 备注型字段为什么不能超过1950字节?是由于备注型字段是有"索引".用Access对数据库的表进行设计时,点试设计视图->索引, 可以看到这个字段有索引.就是这个原因,删掉这个索引就什么事都没有了. 奇怪的是:在ACCESS设计表时,在备注型的字段里,根本就没有选项对备注型字段加上索引功能. 本文来源于 KinJAVA日志 (http://jorkin.reallydo.c

  • Myeclipse连接mysql数据库心得体会

    我是给同学做一个J2EE 关于struct+hibernate结构的课设,数据库以前用的是Oracle,数据库丢失,不想装Oracle,那玩意装在本子上太刀了,卸不掉恶心...就换个mysql给他改改,网上的一些帖子,太老了,版本以及网址都是翻新没有翻内容,头大,不给力啊,还是不能全靠网络,毕竟有些东西要相信自己--想到了自己试试.思考才是王道. 以上都是废话.开始: Myeclipse连接mysql数据库之前先搞定这几项: 步骤: 1. Install JDK,Tomcat,myeclipse

  • 数据库 关键字一览表

    数据库 关键字: 为了避免在数据库表结构设计过程中使用系统保留关键字我们必须知道数据库存在哪些关键字,接下来会列出mysql.oracle.sqlserver三个数据库各自的保留关键字. Mysql http://dev.mysql.com/doc/refman/5.7/en/keywords.html ACCESSIBLE (R) ACCOUNT[a] ACTION ADD (R) AFTER AGAINST AGGREGATE ALGORITHM ALL (R) ALTER (R) ALWA

  • myeclipse中连接mysql数据库示例代码

    1. 环境配置 下载地址:http://www.mysql.com/downloads/mysql/ 真麻烦,下载的话还需要注册和登录以及填个表.上面的信息还挺全的,乱填的信息也是可以接受的~~ 下载后按提示安装即可,最后设置登录mysql用的密码.安装完成后,测试连接数据库.在开始-程序中点击MYSQL5.5 Command Line cilent,输入刚才设定的密码后,应该后就能连上mysql服务器了. 在安装后的软件包中,mysql_server\Connector J XXXX中可以找到

  • 查找oracle数据库表中是否存在系统关键字的方法

    今天在工程中遇到"ORA-01747: user.table.column, table.column 或列说明无效"的报错情况,查了一下是由于数据库列名起的不好引起的,名字用到了数据库的关键字. select * from v$reserved_words where keyword in( select COLUMN_NAME from all_tab_columns where table_name = '表名大写' and owner='用户名大写' ); ID可以忽略

随机推荐