精华内容
下载资源
问答
  • 单个字段的重复数据查找 与 去重多个字段的重复数据查找 与 去重 正文 示例 accountinfo 表数据如下: 场景一 单个字段重复数据查找 & 去重 我们要把上面这个表中 单个字段 account字段相同的数据...

    前文

     

    重复数据的情况分为两种:  

    单个字段 数据重复  

    多个字段 数据重复

    所以该篇的内容就是包括


    单个字段的重复数据查找  与 去重
    多个字段的重复数据查找  与 去重 

     

     

    正文

     

    示例  accountinfo 表数据如下:

     

    场景一   单个字段重复数据查找 & 去重

    我们要把上面这个表中 单个字段 account字段相同的数据找出来。

    思路 分三步 简述:

     

    第一步

    要找出重复数据,我们首先想到的就是,既然是重复,那么 数量就是大于 1  就算是重复。 那就是 count 函数 。

    因为我们要排查的是 单个 字段account ,那么就是需要按照 account 字段 维度 去分组。  那就是 group by 函数。

     

    那么我们第一步写出来的mysql 语句是:
     

     SELECT account ,COUNT(account) as count FROM accountinfo GROUP BY account;

    查询结果如下:

    第二步 

    没错,如我们所想,count大于1的即是 account为 A  和 B 的数据。

    那么我们稍作筛选,只把count大于1的数据的account  找出来。

     第二步,利用having 拼接筛选条件,写出来的mysql 语句是:

     SELECT account FROM accountinfo GROUP BY account HAVING COUNT(account) > 1;
    

    查询结果如下:

     第三步

    重复的account数据 A B 都找出来了,接下来我们只需要把account为A 和 B 的其他数据都一起查询出来。

    那就是利用第二步查出来的数据做为子查询条件,使用 IN 函数。

    第三步写出来的mysql 语句是:

     SELECT * FROM  accountinfo WHERE account IN
     (
     SELECT account FROM accountinfo GROUP BY account HAVING COUNT(account) > 1
     );
    

    查询结果如下:

    可以看到重复的数据都被我们筛选出来了。

     

    那么怎么去重呢? 也就是说,把重复的数据删掉。

    不,准确点应该说是,重复的数据都只留下一条即可,这才是去重。

    紧接着上面,毕竟去重的前提肯定是找重,上面我们已经实现找重了,所以紧接着进行去重。

    按照我们步骤三得到的图,就是我们需要删掉一条account为A的数据, 一条account为B的数据,去重结果图应该如下:

     

    思路也分三步简述:

    第一步

    删掉数据,我们一般选择接住主键来删除,所以我们考虑从id入手。

    再来看我们的重复数据:

     

    如果我们想在这些重复数据里面,每个都保留一条,如 account 为 A 中 id=10 的数据,  account 为B 中 id=20 的数据 ,那么第一步我们就得把这两条数据从上面的

    最终得到的数据 筛选出来,也就是按照 account分组,保留里面id最小的数据。使用 group by min 函数。

    所以去重我们第一步写出来的mysql 语句是:

    SELECT min(id) as id from (
    
    
     SELECT * FROM  accountinfo WHERE account IN
     (
     SELECT account FROM accountinfo GROUP BY account HAVING COUNT(account) > 1
     ) 
     
     
     ) a GROUP BY a.account

    查询结果如下:

     

    第二步

    想要保留的数据已经找出来了,那么接下来就是从所有的重复数据里面 删掉 不为 我们保留的数据 即可 。
    那么就是找出我们需要删除的id, 使用 not in 函数。

    所以去重我们第二步写出来的mysql 语句是:

    SELECT t1.id FROM (
    
    SELECT id  FROM accountinfo WHERE account IN (  SELECT account FROM accountinfo GROUP BY account HAVING COUNT(account) > 1) ) t1 
    
    WHERE t1.id NOT IN (
    
    
    SELECT min(id) AS id FROM (
    
    
     SELECT * FROM  accountinfo WHERE account IN
     (
     SELECT account FROM accountinfo GROUP BY account HAVING COUNT(account) > 1
     ) 
     
     
     ) a GROUP BY a.account
    
    )

    查询的结果为:

    对这个sql语句稍作文字说明:

    第三步,删掉第二步找出来的数据即可,根据id删除。

    所以第三步写出来的mysql语句是:
     

    DELETE FROM accountinfo WHERE id IN (
    
    SELECT t1.id FROM (
    
    SELECT id  FROM accountinfo WHERE account IN (  SELECT account FROM accountinfo GROUP BY account HAVING COUNT(account) > 1) ) t1 
    
    WHERE t1.id NOT IN (
    
    
    SELECT min(id) AS id FROM (
    
    
     SELECT * FROM  accountinfo WHERE account IN
     (
     SELECT account FROM accountinfo GROUP BY account HAVING COUNT(account) > 1
     ) 
     
     
     ) a GROUP BY a.account
    
    )
    
    )
    

     

    执行结果如下图:

     

    场景二  多个字段重复数据查找 & 去重

     

     示例  accountinfo 表数据如下:

     

     想要去重,我们的首要想到的也是先把 重复数据 找出来。

    现在的重复定义是, account 和 deviceId 都相同的 时候,这种数据就是重复数据(也就是上图绿色框出来的就是同时多个字段都存在重复的数据)。

    思路简述:

    第一步

    因为有了文章上半部讲到的单个字段重复的数据查找思路,所以到这边应该更好理解了。

    同样, account 和 deviceId 都相同的重复数据就是指, 这种数据存在的数量 大于 2,那么就是存在重复了。

    我们还是使用到了 group by  函数 和 count 函数 和 having and  函数(因为需要同时满足两个字段条件,使用and)。

    第一步写出来的mysql语句是:

    SELECT account, COUNT(account), deviceId, COUNT(deviceId) 
    FROM accountinfo 
    GROUP BY account, deviceId 
    HAVING  (COUNT(account) > 1) AND  (COUNT(deviceId) > 1) 

    查询出来的结果如下图:

    第二步

    一样 也是把第一步里的到的关键信息 account 和 deviceId做为子查询条件,从原表里把  account 和 deviceId 同时相同的数据都查找出来。

    第二步写出来的mysql语句是:

     

    SELECT t.* FROM  accountinfo t, (
    
    SELECT account, COUNT(account), deviceId, COUNT(deviceId) 
    FROM accountinfo 
    GROUP BY account, deviceId 
    HAVING  (COUNT(account) > 1) AND  (COUNT(deviceId) > 1) 
    ) a 
    
    WHERE t.account=a.account AND t.deviceId=a.deviceId 

     

    查询结果如下图:

     

    可以看到重复的数据都被我们筛选出来了,这些数据里面就是包含 account 和 deviceId 同时都相同的数据!

     

    去重

    第一步

    思路一样,我们对于重复的数据每个只保留一条,那就是把这些涉及重复的数据每个都找出一条,也是根据id入手。

    也就是在account为 C 且 deviceId 为 C333  三条重复数据里面,保留 id最小的 等于30 这一条;

    account为D 且 deviceId 为 D444  二条重复数据里面,保留 id最小的 等于40 这一条.

     

    所以第一步我们先写出来的mysql语句为:
     

    SELECT min(id) as id FROM (
    
    SELECT t.* FROM  accountinfo t, (
    
    SELECT account, COUNT(account), deviceId, COUNT(deviceId) 
    FROM accountinfo 
    GROUP BY account, deviceId 
    HAVING  (COUNT(account) > 1) AND  (COUNT(deviceId) > 1) 
    ) a 
    
    WHERE t.account=a.account AND t.deviceId=a.deviceId 
    
    )a  GROUP BY a.account,a.deviceId
    

    查询结果如下图:

     

     

    第二步

    就是从涉及重复数据里面,找出除了我们需要保留的id之外的那批id, 那就是需要我们执行删除的数据id。

    所以第二步我们先写出来的mysql语句为:

    SELECT t.* FROM  accountinfo t, (
    
    SELECT account, COUNT(account), deviceId, COUNT(deviceId) 
    FROM accountinfo 
    GROUP BY account, deviceId 
    HAVING  (COUNT(account) > 1) AND  (COUNT(deviceId) > 1) 
    ) a 
    
    WHERE t.account=a.account AND t.deviceId=a.deviceId 
    
    ) b   WHERE b.id
    
    NOT IN (
    
    
    SELECT min(id) as id FROM (
    
    SELECT t.* FROM  accountinfo t, (
    
    SELECT account, COUNT(account), deviceId, COUNT(deviceId) 
    FROM accountinfo 
    GROUP BY account, deviceId 
    HAVING  (COUNT(account) > 1) AND  (COUNT(deviceId) > 1) 
    ) a 
    
    WHERE t.account=a.account AND t.deviceId=a.deviceId 
    
    )a  GROUP BY a.account,a.deviceId
    
    )
    
    

    查询出来的结果为:
     

    那么最后删掉这些id的数据即可:

    DELETE FROM accountinfo WHERE id in (
    
    SELECT b.id  FROM  (  
    
    SELECT t.* FROM accountinfo  t, (
    
    SELECT account, COUNT(account), deviceId, COUNT(deviceId) 
    FROM accountinfo 
    GROUP BY account, deviceId 
    HAVING  (COUNT(account) > 1) AND  (COUNT(deviceId) > 1) 
    ) a 
    
    WHERE t.account=a.account AND t.deviceId=a.deviceId 
    
    ) b   WHERE b.id
    
    NOT IN (
    
    
    SELECT min(id) as id FROM (
    
    SELECT t.* FROM  accountinfo t, (
    
    SELECT account, COUNT(account), deviceId, COUNT(deviceId) 
    FROM accountinfo 
    GROUP BY account, deviceId 
    HAVING  (COUNT(account) > 1) AND  (COUNT(deviceId) > 1) 
    ) a 
    
    WHERE t.account=a.account AND t.deviceId=a.deviceId 
    
    )a  GROUP BY a.account,a.deviceId
    
    )
    
    )
    

    去重后结果为:

     

     

    该篇就到此吧。

     

     

    展开全文
  • 1、使用sql语句进行查询(多个字段重复) select  * from  test1 group by factory_name,model_name,hard_version having count(*)>=1 2、将查到的数据导出为csv文件 3、清空表 truncate test1 4、使用...

    1、使用sql语句进行查询(多个字段重复)

    select 

    *
    from 
    test1

    group by factory_name,model_name,hard_version  having count(*)>=1

    2、将查到的数据导出为csv文件

    3、清空表

    truncate test1

    4、使用mysql yog   在test1表右键-》导入-》导入加载本地csv数据


    单个字段重复,只需将group by 后边设置为一个字段即可


    展开全文
  • Oracle 多个字段重复查询

    千次阅读 2017-11-08 15:24:54
    –查询重复数据 select * from app_jf_value t1 where (t1.jfindcode, t1.areacode, t1.kpitype, t1.created_at) in (select jfindcode, areacode, kpitype, created_at

    –查询重复数据
    select *
    from app_jf_value t1
    where (t1.jfindcode, t1.areacode, t1.kpitype, t1.created_at) in
    (select jfindcode, areacode, kpitype, created_at
    from app_jf_value
    group by jfindcode, areacode, kpitype, created_at
    having count(*) > 1);

    展开全文
  • 查询表中多个字段重复的数据记录

    千次阅读 2019-04-16 11:33:20
    select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
    select * from vitae a
    where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq  having count(*) > 1)
    展开全文
  • SELECT   s.periodsno,s.sitename,t.* FROM   subcampaign_doctor t LEFT JOIN `subcampaign` s ON s.id=t.subCampaignId WHERE  (SELECT COUNT(1) FROM subcampaign_doctor WHERE subCampaignId=t....
  • table user  name age nub  张三 12 23  张三 12 23  张三 12 23  李四 13 21  李四 13 21  王五 11 25 查询重复记录(一条) sql:select * from user group by name,age,nu
  • 希望通过一SQL语句过滤出形如: 1 A X 2 B XX 的数据。   可使用至少两种方式来做: 方法一: SELECT CODE,NAME,COUNT(*) AS [COUNT],MAX(ID) AS ID FROM TEST GROUP...
  • Mysql根据多个字段找出重复数据

    千次阅读 2019-05-07 11:12:29
    根据一个字段判断是否相同很容易,两个字段分组后面可以继续添加添加,它们之间是and的关系,相当于sno和sname都相同的数据才会被显示,注意要取一个中间字段(sno )来做数据的第二次筛选! SELECT * FROM tb_test_...
  • 参考 : https://blog.csdn.net/n950814abc/article/details/82284838 https://www.cnblogs.com/liyue-sqsf/p/9076902.html 单个字段(CODE) DELETE FROM `TEST` WHERE `ID` IN( SELECT * FROM( S...
  • MySQL 过滤多个重复字段

    千次阅读 2018-11-08 09:09:58
    MySQL 执行查询时,如果需要从记录中过滤多个重复字段,可通过以下方式 更多精彩 更多技术博客,请移步 asing1elife’s blog 实现方式 关键点在于 COUNT(DISTINCT vs.name) ,DISTINCT 是 MySQL 用于过滤重复...
  • DISTINCT 多字段重复

    万次阅读 2019-09-20 15:59:40
    DISTINCT 多字段去重复 DISTINCT 后面只能跟一个去重复的条件,那结果是想以一个字段去重复,查多个字段怎么办呢? SELECT id , name, sex FROM hehe GROUP BY id; ...
  • 情况一:对一个字段查找重复记录表数据: a. 首先根据sample_code字段找到重复记录SELECT * FROM tb_table WHERE sample_code IN( SELECT sample_code FROM tb_table GROUP BY sample_code HAVING COUNT(sample_...
  • mysql根据两个字段判断重复的数据并且删除,只保留一条。以及MySQL统计重复数据,根据条字段查询。
  • 比如说数据库有a,b,c,d,e,f,g这几个表都有几个字段是相同的,例如描述字段,更新时间字段 修改人字段等等,这个时候是单独抽出一个表记录这些重复信息,用外键关联,还是就让他有多个重复字段算了
  • Mysql数据库中根据某个或多个字段查询重复数据的sql语句sql 查出一张表中重复的所有记录数据 sql 查出一张表中重复的所有记录数据 1.表中有id和name 两个字段,查询出name重复的所有数据 select * from xi a where ...
  • sql---distinct显示多个字段,去重复

    万次阅读 2017-05-13 16:59:40
    众所周知,distinct可以列出不重复的记录,对于单个字段来说distinct使用比较简单,但是对于多个字段来说,distinct使用起来会使人发狂。而且貌似也没有见到微软对distinct使用多字段的任何说明。下面就提供了一种...
  • SQL删除表中多余的重复记录(多个字段都是重复的) delete from user a where (a.id,a.name) in (select id,name from user group by id,name having count(*) > 1) and id not in (select min(id) from ...
  • MyBatis 使用表联查,两张表中字段重复时,采用取别名方法解决 结果显示图: product.* 里面包含了name属性,category也有name属性,所以将category.name 取了别名"category_name" 映射 : <resultMap id=...
  • List去重复——多个复杂字段判断去重
  • 问题场景当系统没有处理好并发操作的情况下,操作人员同时操作一张表的情况下,数据库有可能被插入相同记录,这些会带来隐藏的bug。...情况一:对一个字段查找重复记录表数据: a. 首先根据sample
  • oracle查找/删除重复的数据(单个字段和多个字段条件) 单个字段: --查找重复的全部数据(单个字段) 思路: 1.根据字段tid分组,数量大于1的表示tid字段有重复的数据; 2.根据1查询出来的tid数据为条件,再查询全部...
  • select 字段1,字段2 from 表名 group by 字段1,字段2 having count(*)>1
  • 1.查询重复记录 select * from 表名 where 重复字段 in (select 重复字段 from 表名 group by  重复字段 having count(重复...where 重复字段 in (select 重复字段 from 表名 group by 重复字段 hav
  • --修改字段类型: --alter table 表名 alter column 待修改字段名 待修改字段类型 ...--多个字段建立唯一索引 create unique index [索引名] on 表名(字段名,字段名) alter table 表名 add constraint 约束名 unique
  • SQL—distinct显示多个字段,多列问题,去重复 select distinct on (Name,number) Name ,number,score from student 这段主要对两列name,number,去重,显示后面Name ,number,score 很实用。 ...
  • 现在需要查询当前字段重复的个数 mysql>select filed ,count(*) as total from A group by field having count(1)>1 那么having 的在group by 后面执行 取到group by 的结果后在进行聚合统计大于1的数数据行 ...
  • 如何用distinct消除重复记录的同时又能选取多个字段值? 如何用distinct消除重复记录的同时又能选取多个字段值? 需求是:我要消除name字段值重复的记录,同时又要得到id字段的值,其中id是自增字段。 select ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 461,492
精华内容 184,596
关键字:

多个字段重复