精华内容
下载资源
问答
  • 最近做项目,发现oracle中存在重复数据,导致项目查询结果冗余,特此需要对数据进行去重。比如下面截图所示: 场景一:根据单个字段(Id)来判断重复记录 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)...

    项目背景
    最近做项目,发现oracle中存在重复数据,导致项目查询结果冗余,特此需要对数据进行去重。比如下面截图所示:
    在这里插入图片描述
    场景一:根据单个字段(Id)来判断重复记录
    1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断

    select * fromwhere Id in (select Id fromgroup by Id having count(Id) > 1);
    

    2、删除表中多余的重复记录,重复记录是根据单个字段(Id)来判断,只留有rowid最小的记录

    DELETE fromWHERE (id) IN (
     SELECT id FROMGROUP BY id HAVING COUNT(id) > 1)
     AND ROWID NOT IN (
     SELECT MIN(ROWID) FROMGROUP BY id HAVING COUNT(*) > 1);
    

    场景二:根据多个字段来判断重复记录
    1、查找表中多余的重复记录(多个字段)

    select * from 表 a where (a.Id,a.seq) 
    in(select Id,seq fromgroup by Id,seq having count(*) > 1);
    

    2、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

    delete from 表 a where (a.Id,a.seq) 
    in (select Id,seq fromgroup by Id,seq having count(*) > 1) 
    and rowid not in (select min(rowid) 
    fromgroup by Id,seq having count(*)>1);
    

    执行结果
    在这里插入图片描述
    场景三:多表关联查询,过滤重复数据记录,相同记录只查询一条
    原始记录如下图所示:
    在这里插入图片描述
    核心SQL语句如下:

    SELECT
        * 
    FROM
        ( SELECT row_number () over ( partition BY 分组的字段名 ORDER BY 排序字段名 DESC ) rn, 字段名 FROM 表名 ) 
    WHERE
        rn = 1
    

    则经过过滤去重,查询出结果为:
    在这里插入图片描述

    在Oracle数据库中拉数据时,需要过滤替换掉空值null。原始表数据如下:
    在这里插入图片描述
    需要将material列中的null值和materialNo中的null值合并成不包含null的新列,
    借助NVL()函数,实现从两个表达式返回一个非 null 值

    --如果 eExpression1 的计算结果为 null 值,则 NVL( ) 返回 eExpression2。
    --如果 eExpression1 的计算结果不是 null 值,则返回 eExpression1。
    --eExpression1 和 eExpression2 可以是任意一种数据类型。
    --如果 eExpression1 与 eExpression2 的结果皆为 null 值,则 NVL( ) 返回 NULL。
    NVL(eExpression1, eExpression2)
    

    利用NVL函数执行之后的结果为:
    在这里插入图片描述

    展开全文
  • id,MatchName,MatchTime,master,guest,现在是因为写入数据库的时候会出现重复数据,请问一下应该怎么过滤?sql语句怎么写?![图片说明](https://img-ask.csdn.net/upload/201603/07/1457326425_115865.png)
  • 数据库中有重复数据时,用到哪些sql语句? 这里有若干数据,并掺杂了重复数据 1. 查看过滤重复后的数据 思路, group by 分组可以对多个列进行分组, 分组后可以过滤掉重复的数据 sql语句: SELECT id,`name`,...

    数据库中有重复数据时,用到哪些sql语句?
    建表:

    CREATE TABLE `user` (
      `id` bigint(255) NOT NULL AUTO_INCREMENT,
      `name` varchar(20) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '名称',
      `age` int(2) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
    

    这里有若干数据,并掺杂了重复数据
    在这里插入图片描述

    1. 查看过滤重复后的数据

    思路, group by 分组可以对多个列进行分组, 分组后可以过滤掉重复的数据
    这里在mysql5.7以上版本会报错,因为不支持select那些group by和聚合函数之外的字段
    sql语句:

    SELECT id,`name`,age,count(1)
    	FROM user GROUP BY `name`,age
    

    在这里插入图片描述
    这里要么把id去掉,要么选择临时方案:

    set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
    set @@SESSION.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
    
    SELECT id,`name`,age,count(1)
    	FROM user GROUP BY `name`,age;
    

    2. 查看重复的数据

    刚刚的语句已经把每个组对应的count数查询出来了,那么count>1的自然是重复的数据

    SELECT id,`name`,age,count(1) as c
    	FROM user GROUP BY `name`,age having c > 1
    

    在这里插入图片描述

    3. 删除重复的数据留下一条

    思路: 刚刚已经把重复的数据查询出来了,包括id, 那么查询出每个重复组中的唯一一个id,也就是x,就可以delete … id not in (x)

    上面说虽然5.7以上版本默认不支持查询group by 以外的字段,比如id,但是聚合函数还是可以的
    子语句1:

    SELECT MIN(id) FROM user
    			GROUP BY name,age 
    

    查询出来的id就是我们需要留下的不重复的数据的id
    在这里插入图片描述

    按理来说只要:
    delete from user where id not in 子语句1

    DELETE FROM user
    	WHERE id NOT IN (
    		SELECT MIN(id) FROM user
    			GROUP BY name,age 
    	)
    

    但是报错了

    DELETE FROM user
    	WHERE id NOT IN (
    		SELECT MIN(id) FROM user
    			GROUP BY name,age 
    	)
    > 1093 - You can't specify target table 'user' for update in FROM clause
    > 时间: 0.007s
    

    因为在mysql中,不能在一条Sql语句中,即查询这些数据,同时修改这些数据

    解决方法:select的结果再通过一个中间表temp进行select多一次,就可以避免这个错误

    DELETE FROM user
    	WHERE id NOT IN (
    		SELECT temp.min_id FROM (
    			SELECT MIN(id) min_id FROM user
    				GROUP BY name,age
    			)AS temp
    	);
    select * from user;
    	
    

    删除成功:
    在这里插入图片描述

    展开全文
  • 根据多个字段查询重复数据:SELECT A,B,C FROM TABLE WHERE CONDITION GROUP BY A,B,C HAVING COUNT(*)>1 即可,但是现在的需求是: 最终查询的字段多于分组字段,且同一字段的空值也视为重复。在网上查询了很多...

    根据多个字段查询重复数据:SELECT A,B,C FROM TABLE WHERE CONDITION GROUP BY A,B,C HAVING COUNT(*)>1 即可,但是现在的需求是:

    最终查询的字段多于分组字段,且同一字段的空值也视为重复。在网上查询了很多资料,也询问了同事最后尝试出如下sql:

    SELECT A,B,C,D,E FROM TABLE A WHERE EXISTS(SELECT A,B,C FROM TABLE B WHERE CONDITION AND COALESCE(A.A,'0')=COALESCE(B.A,'0') AND COALESCE(A.B,'0')=COALESCE(B.B,'0') AND COALESCE(A.C,'0')=COALESCE(B.C,'0') GROUP BY A,B,C HAVING COUNT(*)>1);

    注意:上述sql中coalesce()函数中的后一个值是自己设置的,但设置的值的类型要与前一个值的类型相同。


    如果要处理相同条件下查询出的数据,可使用如下sql:

    DELETE FROM TABLE WHERE ID NOT IN(SELECT ID FROM

    (SELECT MIN(ID) ID,A,B,C FROM TABLE WHERE CONDITION GROUP BY A,B,C HAVING COUNT(*)>1) C) 

    AND ID IN(SELECT ID FROM TABLE A WHERE EXISTS 

    (SELECT A,B,C FROM TABLE B WHERE CONDITION AND COALESCE(A.A,'0')=COALESCE(B.A,'0') AND COALESCE(A.B,'0')=COALESCE(B.B,'0') AND COALESCE(A.C,'0')=COALESCE(B.C,'0') GROUP BY A,B,C HAVING COUNT(*)>1))

    这里涉及到IN 与EXISTS,NOT IN与NOT EXISTS的区别,有兴趣的同学可以查一查。

    虽然能实现查重及去重功能,但是在大数据量时模型会运行特别慢,和数据库也有一定关系。

    展开全文
  • 数据库去除重复数据

    千次阅读 2018-03-09 11:21:06
    一个是关于去除重复数据的(除了唯一标识符,其他都一样的数据)。(如果只是查询的过程中去掉重复数据,只需把NOT IN改为IN即可。)第二个是关于修改同一列不同行数据的问题。我遇到的是默认地址的问题,把一个设置为...

    今天主要想分享一下关于数据库的两个东西,感觉挺实用的。一个是关于去除重复数据的(除了唯一标识符,其他都一样的数据)。


    (如果只是查询的过程中去掉重复数据,只需把NOT IN改为IN即可。)

    第二个是关于修改同一列不同行数据的问题。我遇到的是默认地址的问题,把一个设置为默认地址的时候就要把别的设置为不默认。(表中有一个关于是否是默认地址的标识isDefault)采用的是 case when 语句实现。


    第二个没有亲测,如若有什么问题,请指出,谢谢。

    展开全文
  • 1.group by过滤重复数据 用法:对table表中两个字段都重复的过滤 SELECT column1, column2 FROM table GROUP BY column1, column2; group by过滤重复数据还可以做到很灵活,例如想对重复几次的数据过滤,比如...
  • 来源 : ...   统计重复数据 以下我们将统计表中 first_name 和 last_name的重复记录数: mysql> SELECT COUNT(*) as repetitions, last_name, first_name -> FROM per...
  • Java防止重复数据多次调用接口导致数据库插入重复记录
  • @Mapper public interface TerminalMapper { Integer validateRecord(List<TerminalVO> list); }     <select id="validateRecord" resultType="...gt...
  • 2.过滤出存在重复数据的信息: SQL语句: SELECT dname FROM dept GROUP BY dname HAVING count( dname ) >1 数据库筛选结果: 3.从重复数据中筛选出一条需要保存的数据: SQL语句: SELECT min( ...
  • oracle过滤重复数据

    千次阅读 2018-11-23 18:03:50
    Distinct,用distinct关键字只能过滤查询字段中所有记录相同的(记录集相同) (1)取一个字段,去除重复项。假设要id这个字段的值:  select distinct name from t1; --能消除重复记录,缺点:但只能取一个字段...
  • 问题:储存型Xss是由于form表单提交的数据,前端和后台未进行过滤,将一些javascript的脚步语言存入数据库中。导致再次查询数据的时候浏览器会执行该脚步语言。如:<script>alert("XSS")&...
  • 如若表中的部分字段没有唯一约束性,就会查询出重复数据。为了查询出不重复的数据,MYSQL 提供了distinct 关键字实现数据去重。 例: TEST 数据库中的数据表TABLE,其表结构和表数据如下 select a.* from table a; ...
  • mysql数据库中避免重复数据插入

    万次阅读 2018-06-29 15:42:20
    首先 数据库中已经存在重复数据 并且数据量很大 之前并没有设置重复字段为唯一索引 需求: 修改sql语句在插入时 避免重复插入 网上看了几个博客都是设置唯一索引 使用ignore或者REPLACE INTO 或者ON DUPLICATE ...
  • //查询方法 public List<HomeUser> find(){ //去除重复数据 Cursor user = db.query(true,"user", null, null, null, "name", null, null,null); List<HomeUser> list=new ArrayList(); while (u
  • 数据库去除重复记录

    万次阅读 2018-05-29 17:37:34
    最近遇到一个面试题,所以跟大家分享下: 如何删除数据库重复的记录 一般情况下,数据库重复有以下那么三种方法: 第一种: 两条记录或者多条记录的每一个字段值完全相同,这种情况去重复最简单,用关键字...
  • 关于数据库表的数据重复问题

    千次阅读 2018-11-21 16:04:55
    这里可以看到分摊页签的4条数据,就是这样,但是由于当时不知道谁写的SQL,最后会distinct一下,这样就把相同的数据过滤掉了。 解决方案: 第一步:找到问题所在关键,前台数据显示不正确,就要去看SQL的问题,...
  • insert into security_role_group_rel(GRP_ID,ROLE_ID,RG_ID)  select '$GRP_ID$','$ROLE_ID$',uuid() from dual  where NOT EXISTS (select * from security_role_group_rel where GRP_ID = '$GRP_ID$' and ...
  • 文本展示(可copy进txt,导入excel,再导入数据库生成): 序号,企业,建设主体 1,渝兴印刷厂,供销社 2,莱迅塑胶材料厂,供销社 3,金盏塑料厂,粮管所 4,红林五金电器厂,粮管所 5,永明五金加工厂,粮管...
  • 数据库中 join 链接过滤重复的记录

    千次阅读 2011-01-14 16:51:00
    sql 滤重复记录
  • 一条一条地删掉重复数据是一种很蠢的办法。 况且,大神经常说,一定要学会偷懒啊!!!! 数据重复怎么办呢?1,首先,查出数据,重复数据只保留一条。那就是用到union的时候啦。 关于union的使用,请参照前面的...
  • 也就是device_id字段不能重复,消除device_id字段重复的记录,而且device_id对应的检测信息test_result是最新的。   解决思路:用Oracle的row_number() over函数来解决该问题。 解决过程:
  • 实现从vector中过滤重复数据

    万次阅读 2014-09-05 15:45:15
    实现从vector中过滤重复数据
  • select * from t_case where CAR_NUMBER in (select CAR_NUMBER from t_case group by CAR_NUMBER having count(CAR_NUMBER) > 1)      DELETE from t_case WHERE (CAR_NUMBER) IN ( SELECT CAR_NUMBER

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 137,851
精华内容 55,140
关键字:

数据库过滤重复数据