记得以前有个同事问过我这个,说是以前面试的时候碰到的问题,下面我介绍三种方法。

首先我们在这里创建一个测试表添加相应的测试数据。

create table test  (id number,name varchar(10));
  insert into  test values(1,'liufang');
  insert into  test values(2,'xiaozhang');
  insert into  test values(3,'dawei');
  insert into  test values(4,'laotan');
  insert into  test values(5,'laotan');
  insert into  test values(6,'laotan');
  insert into  test values(7,'dawei');

1、根绝name相同 ID不同来的方式来判断(id必须唯一)

delete from test a where exists (select null from test b where b.name=a.name and b.id>a.id);

2、用rowid 来代替其中的id,比上面的方法更适用,没有字段唯一限制

delete from test a where exists (select null from test b where b.name=a.name and b.rowid>a.rowid);

3、  通过分析函数根据name 分组生成序号,然后删除序号大于1 的数据

(注:rder by 2,3根据查询的第二第三个字段升序排序查询)

select  rowid as rid,name,row_number() over(partition by name order by id) from test order by 2,3;

分析函数会吧对应名称相同的字段出现的次数记录下来,把对应次数大于1 的数据删除即可

分析函数:ROW_NUMBER() OVER (partition by name order by name)  简单的说row_number()从1开始,为每一条分组记录返回一个数字,

这里的ROW_NUMBER() OVER (partition by name order by name) 是先把name列升序,再为降序以后的没条name记录返回一个序号,

delete from test
    where rowid in (select rowid
                      from (select rowid as rid,
                                   row_number() over(partition by name order by id) as seq
                              from test)
                     where seq > 1);

oracle中删除表中某字段出现重复的信息 保留其中一条的更多相关文章

  1. 面试题中经常遇到的SQL题:删除重复数据,保留其中一条

    如题,解决思路如下: 1.首先我们需要找出拥有重复数据的记录 ---以name字段分组 select Name,COUNT(Name) as [count] from Permission group ...

  2. sql server 中删除表中数据truncate和delete的区别(转载自.net学习网)

    我们都知道truncate table可以用来删除整个表的内容,它与delete后面不跟where条件的效果是一样.但除此之外,我们还清楚它们之间有其它的区别吗?本章我们将一起讨论truncate与d ...

  3. 【转】SQL删除重复记录,只保留其中一条

    SQL:删除重复数据,只保留一条用SQL语句,删除掉重复项只保留一条在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1.查找表中多余的重复记录,重复记录是根据单个字段(peop ...

  4. SQL Server中删除表中重复数据

    方法一:利用游标,但要注意主字段或标识列 declare @max integer,@id integer open cur_rows fetch cur_rows into @id,@max beg ...

  5. sql 删除重复数据且保留其中一条 用sql 关键字:with ROW_NUMBER

    --1.建立表:Coursecreate table Course( ID int identity(1,1),--ID Student varchar(20) ,--学生 Sub varchar(2 ...

  6. ORACLE数据库删除表中记录报record is locked by another user

    在操作ORACLE数据库的时候,由于执行完,没有COMMIT,直接把PL/SQL关闭掉,后来导致那张表被锁住,当编辑时就会出现这个信息,record is locked by another user ...

  7. 如何在MySQL中删除表中指定列的唯一键?

    语法结构如下: alter table table_name drop  index column_name;

  8. 从mysql数据库删除重复记录只保留其中一条

    这两天做了一个调用第三方接口的小程序,因为是实时更新数据,所以请求接口的频率就很高,这样有时会出现往数据库插入重复的数据,对数据库造成压力也不方便管理,因为要通过原生sql语句,解决数据库的去重问题. ...

  9. Oracle删除表中的重复数据

    Oracle数据库删除表中的重复数据,只保留其中的一条,以两个字段为例,提供两种方法 ①.直接delete重复的数据 delete from table_name t1 where (t1.col1, ...

随机推荐

  1. DIV伸缩盒子box

    <div class="div1"> <div class="box"> <div>A</div> <di ...

  2. Comet:基于 HTTP 长连接的“服务器推”技术解析

    原文链接:http://www.cnblogs.com/deepleo/p/Comet.html 一.背景介绍 传统web请求,是显式的向服务器发送http Request,拿到Response后显示 ...

  3. 图说设计模式(UML和设计模式)

    https://github.com/me115/design_patterns http://design-patterns.readthedocs.org/zh_CN/latest/index.h ...

  4. filter应用案例二:权限控制

    filter可以用来进行权限控制,比如admin文件夹下的文件只允许管理员进入,那么,可以给admin文件夹加上一个过滤器: 简单代码示例: import java.io.IOException; i ...

  5. HDU 5875 Function (2016年大连网络赛 H 线段树+gcd)

    很简单的一个题的,结果后台数据有误,自己又太傻卡了3个小时... 题意:给你一串数a再给你一些区间(lef,rig),求出a[lef]%a[lef+1]...%a[rig] 题解:我们可以发现数字a对 ...

  6. PHP学习之字符串

    1.字符串变量用于存储并处理文本: 2.字符串变量用于包含有字符的值,在创建字符串后,就可以对它进行操作了,可以直接在函数中使用字符串,或把它存储在变量中: <?php $txt="H ...

  7. 贪心 Codeforces Round #289 (Div. 2, ACM ICPC Rules) B. Painting Pebbles

    题目传送门 /* 题意:有 n 个piles,第 i 个 piles有 ai 个pebbles,用 k 种颜色去填充所有存在的pebbles, 使得任意两个piles,用颜色c填充的pebbles数量 ...

  8. 实战Hadoop中遇到的几个类、接口说明

    1. Configuration :public 类型接口,这个接口包含的多数方法是进行与数据属性<key,value>有关的操作. 几个方法: 1)addProperty(String ...

  9. BZOJ3692 : 愚蠢的算法

    两个函数相同等价于不存在长度为$3$的下降子序列. 先考虑随意填的部分,设$f[i][j]$表示考虑了$[i,n]$,下降子序列第$2$项的最小值的是这里面第$j$个的方案数,转移则考虑往序列里插数字 ...

  10. BZOJ 1059 & 二分图匹配

    题意: 判断一个黑白染色的棋盘能否通过交换行或列使对角线上都是黑色. SOL: 真是有点醉...这种问题要么很神要么很水...第一眼感觉很水但就是不造怎么做...想了10分钟怎么感觉就是判断个数够不够 ...