精华内容
下载资源
问答
  • 多个字段重复
    千次阅读
    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)
    更多相关内容
  • 1.表中有id和name 两个字段,查询出name重复的所有数据 select * from xi a where (a.username) in (select username from xi group by username having count(*) > 1) 2、查询出所有数据进行分组之后,和重复数据...
  • 单个字段的重复数据查找 与 去重多个字段的重复数据查找 与 去重 正文 示例 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、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断  select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 例二:  ...
  • oracle查找/删除重复的数据(单个字段和多个字段条件)单个字段:--查找重复的全部数据(单个字段)思路:1.根据字段tid分组,数量大于1的表示tid字段有重复的数据;2.根据1查询出来的tid数据为条件,再查询全部重复的...

    oracle查找/删除重复的数据(单个字段和多个字段条件)

    单个字段:

    --查找重复的全部数据(单个字段)

    思路:

    1.根据字段tid分组,数量大于1的表示tid字段有重复的数据;

    2.根据1查询出来的tid数据为条件,再查询全部重复的数据。

    SQL:

    select t.*from test1108 twhere t.tid in (select tidfrom test1108group by tidhaving count(tid) > 1);

    --删除多余的重复数据(单个字段),重复的数据保留rowid最小的行

    思路:

    1.根据字段tid分组,数量大于1的表示有重复数据;

    2.因表中每行都有一个伪列rowid,查找出重复数据中最小的rowid;

    3.根据1、2的并行条件重复的数据,但保留重复数据中rowid最小的值。

    SQL:

    delete from test1108 twhere t.tid in (select tidfrom test1108group by tidhaving count(tid) > 1)and rowid not in (select min(rowid)from test1108group by tidhaving count(tid) >1);

    多个字段:

    --查找重复的全部数据(多个字段)

    思路:

    1.根据字段tid,tname分组,数量大于1的表示字段tid,tname有重复的数据;

    2.根据1查询出来的tid,tname数据为条件,再查询全部重复的数据。

    SQL:

    select * from test112101 twhere (t.tid,t.tname) in (select tid,tnamefrom test112101 t1group by t1.tid,t1.tname having count(*) >1);

    --删除多余的重复数据(多个字段),重复的数据保留rowid最小的行

    思路:

    1.根据字段tid,tname分组,数量大于1的表示有重复数据;

    2.因表中每行都有一个伪列rowid,查找出重复数据中最小的rowid;

    3.根据1、2的并行条件重复的数据,但保留重复数据中rowid最小的值。

    SQL:

    delete from test112101 twhere (t.tid,t.tname) in (select tid,tnamefrom test112101 t1group by t1.tid,t1.tname having count(*) >1)and rowid not in(select min(rowid) from test112101group by tid,tname having count(1)> 1);

    展开全文
  • MySQL 数据库根据一个或多个字段查询重复数据 1、根据一个字段查找重复数据 比如,User 表中的 userName 需要保持唯一,查询重复数据的语句如下: SELECT userName from User GROUP BY userName HAVING count(*) >...

    MySQL 数据库根据一个或多个字段查询重复数据

    1、根据一个字段查找重复数据

    比如,User 表中的 userName 需要保持唯一,查询重复数据的语句如下:

    SELECT userName from User GROUP BY userName HAVING count(*) > 1;
    

    2、根据多个字段查找重复数据  比如,User 表中的 userName、loginType 需要保持数据的唯一性,查询重复数据的语句如下:

    SELECT * FROM User GROUP BY userName,loginType HAVING count( * ) > 1;
    
    展开全文
  • 【SQL】多字段查找重复

    千次阅读 2022-02-17 17:22:47
    根据多个字段查找重复的数据 select * from table_test a where ( a.api_project_quota_id, a.api_breed_id, a.api_quota_id, a.api_unit_id, a.api_sample_id, a.api_device_id ) in ( select api_project_quota_id...
  • 之前上线了一类似于微信或者支付宝账单的功能,其中有一张统计表。里面根据用户ID、年、月查询出来当月的订单数以及订单总金额。当时在创建索引的时候,是根据用户ID、年、月字段创建的联合索引。
  • 1、使用sql语句进行查询(多个字段重复) select  * from  test1 group by factory_name,model_name,hard_version having count(*)>=1 2、将查到的数据导出为csv文件 3、清空表 truncate test1 4、使用...
  • mysql对多个字段进行排序(行排序)

    千次阅读 2022-04-05 18:46:51
    如果是对某个列进行排序,可以用order by 字段,但如果是对多个字段排序呢??? sort_array()函数,可对多个字段进行排序。 用法:sort_array(array(字段1,字段2,。。。)),默认是升序 举个例子:表A有...
  • 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
  • 作用是踢除重复数据其中一_id,让后面的删除语句不会删除所有数据 4.使用forEach循环根据_id删除数据 $addToSet 操作符只有在值没有存在于数组中时才会向数组中添加一值。如果值已经存在于数组中,$addToSet...
  • 删除部分字段重复的数据,保留其中一条记录数据 2,效果图: 处理前: 处理后: 3,SQL delete FROM Atable WHERE EXISTS ( SELECT id FROM( SELECT name, code FROM Atable GROUP BY name, code HAVING COUNT...
  • mysql根据多字段删除重复的数据’ DELETE FROM 表名 WHERE (字段1,字段2,字段3) IN (SELECT 字段1,字段2,字段3 FROM (SELECT 字段1,字段2,字段3 FROM 表名 GROUP BY 字段1,字段2 HAVING COUNT(*)>1) t1); ...
  • sql---distinct显示多个字段,去重复

    万次阅读 2017-05-13 16:59:40
    众所周知,distinct可以列出不重复的记录,对于单个字段来说distinct使用比较简单,但是对于多个字段来说,distinct使用起来会使人发狂。而且貌似也没有见到微软对distinct使用多字段的任何说明。下面就提供了一种...
  • 一、背景 一张person表,有id和name的两个字段,id是唯一的不允许重复,id相同则认为是重复的记录。二、解决 select id from group by id having count(*) > 1 按照id分组并计数,某个id号那一组的数量...
  • Mysql根据多个字段找出重复数据

    千次阅读 2019-05-07 11:12:29
    根据一个字段判断是否相同很容易,两个字段分组后面可以继续添加添加,它们之间是and的关系,相当于sno和sname都相同的数据才会被显示,注意要取一个中间字段(sno )来做数据的第二次筛选! SELECT * FROM tb_test_...
  • sql查询全部字段、多个字段,group by去掉某几个字段重复的数据,以及group by关联查询用法 1.SELECT 后面的字段必须和group by后面的相同,所以如果需要查询更多字段,可以给其它字段加上个函数,比如max()...
  • 用java8对list按照多个字段进行去重

    千次阅读 2019-04-11 00:57:38
    现在有一个实体类Person,属性有三个,分别是name,age,...中三个字段都相同的数据进行去重。 //创建list,添加数据 List<Person> list = new ArrayList<>(); list.add(new Person("Tom", 15, "Am...
  • 参考 : 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更新多个字段语句写法!

    万次阅读 2021-01-18 19:15:19
    mysql 数据库,更新字段语句:一、UPDATE:UPDATE的功能是更新表中的数据。这的语法和INSERT的第二种用法相似。必须提供表名以及SET表达式,在后面可以加WHERE以限制更新的记录范围。UPDATE table_anem SET column_...
  • MyBatis 使用表联查,两张表中字段重复时,采用取别名方法解决 结果显示图: product.* 里面包含了name属性,category也有name属性,所以将category.name 取了别名"category_name" 映射 : <resultMap id=...
  • select 字段1,字段2 from 表名 group by 字段1,字段2 having count(*)>1
  • 情况一,直接查出重复--查出表中有重复的id的记录,并计算相同id的数量select id,count(id) from @table group by id having(count(id)>1)其中,group by id,是按id字段分组查询:select id,count(id) from @...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 549,713
精华内容 219,885
关键字:

多个字段重复

友情链接: MAIN.rar