精华内容
下载资源
问答
  • 查询一张表中是否有重复数据

    万次阅读 2018-04-26 14:35:28
    查询一张表中是否有重复数据行 业务情景: 查询一张表中重复数据;或者统计有几个列是否存在重复。 查询sql 按照某些字段进行分组统计,例如,可以按照主键等进行分组,就能统计是否有重复行。语句如下: ...

    查询一张表中是否有重复数据行

    业务情景: 查询一张表中是重复数据;或者统计有几个列是否存在重复。


    查询sql

    按照某些字段进行分组统计,例如,可以按照主键等进行分组,就能统计是否有重复行。语句如下:

    select A,B from table1 group by A,B having count(*) > 1;

    案例分析

    分析 kx_kq_channelsupplier 表中是否存在channelid有多个isdefault=1 的行

    SELECT
        channelid,
        isdefault
    FROM
        kx_kq_channelsupplier
    GROUP BY
        channelid,
        isdefault
    HAVING
        COUNT (*) > 1
    AND isdefault = 1;

    channelidisdefault
    9763476098558238721
    9756505186743132161
    9756505182968258561

    结果:确实存在三条这样的记录;这样的记录在数据库中就是可能是脏数据,从而影响程序的正确性。

    展开全文
  • 一、怎样查询重复数据 1. 查询一个表中所有字段都相同的记录  比如现在有一人员 (表名:peosons)  若想将姓名、编号、住址这三个字段完全相同的记录查询出来:   select p1.* from persons p1,...

    一、怎样查询重复数据

    1.  查询一个表中所有字段都相同的记录

        比如现在有一人员表   (表名:peosons)  
        若想将姓名、编号、住址这三个字段完全相同的记录查询出来: 

        select  p1.*  from  persons  p1,persons  p2  where  p1.name=p2.name  and  p1.id =  p2.id  and  p1.address=p2.address                  group by p1.name,p1.id,p1.address  having count(*) >1; 

        或者:

        select  p1.*  from  persons  p1,persons  p2  where  p1.name=p2.name

    and  p1.id=p2.id  and  p1.address=p2.address  and  p1.rowid<>p2.rowid;

       或者:(下面这条语句执行效率更高)

       select  *  from (select  p.*,row_number()  over  (partition  by  name,

    id,address  order  by  name)  rn  from  persons  p)  where  rn>1;

    可以实现上述效果。   


    2. 查询一个表中某字段相同的记录

       语法:select  p1.*  from  表名 p1,(select  字段  from  表名 group  by  字段  having  count(*)>1)  p2  where  p1.字段=p2.字段;

       select  p1.*  from  persons  p1,(select  address  from  persons  group  by  address  having  count(*)>1)  p2

    where  p1.address=p2.address;

      

    3. 查询一个表中某字段相同的记录,其它字段不用查询出来

        select  name,count(*)  from  persons group  by  name  having  count(*) >1;  


    二、几个删除重复记录的SQL语句 

    1 .用rowid方法   
    2 .用group by方法   
    3 .用distinct方法   
          
    1. 用rowid方法   
        据据Oracle带的rowid属性,进行判断,是否存在重复,语句如下:   
        查数据:   
           select  *  from  table1  a  where  rowid != (select  max(rowid)      
                 from  table1  b  where  a.字段1=b.字段1  and  a.字段2=b.字段2......);   
         删数据:   
           delete  from  table1  a  where  rowid != (select  max(rowid)      
                 from  table1  b  where  a.字段1=b.字段1  and  a.字段2=b.字段2......)   

    2. group by方法   
        查数据:   
           select  count(name), max(id)  from  persons  --  列出重复的记录数,并列出他的ID属性   
                 group  by  name  
                        having  count(name) > 1  -- 按name分组后找出表中name列重复,即出现次数大于一次   
        删数据:   
           delete  from  persons
                 group  by  name  
                        having count(name) > 1   
       这样的话就把所有重复的都删除了。   
     

    3. 用distinct方法 - 对于小的表比较有用   
        create  table  table_temp  as  select  distinct  *  from  persons; 
        truncate  table  persons;    --  如果在生产中最好对该表进行backup
        insert  into  persons  select  *  from  table_temp;   
        

    三、查询及删除重复记录的方法大全   
      
    1 、查找表中多余的重复记录,重复记录是根据单个字段 (id)来判断   
           select  *  from  persons  
                    where  id  in (select  id  from  persons  group  by  id  having  count(id) > 1);   
      
    2 、删除表中多余的重复记录,重复记录是根据单个字段(id)来判断,只留有rowid最小的记录   
           delete  from  persons   
                    where  id   in (select   id   from  persons  group  by  id  having  count(id) > 1)   
                           and  rowid  not  in  (select  min(rowid)  from  persons  group  by  id  having  count(id )> 1 );   
      
    3 、查找表中多余的重复记录(多个字段)   
            select  *  from  persons  a   
                   where  (a.name,a.id)  in  (select  name,id  from persons  group  by  name,id  having count(*) > 1);   
      
    4 、删除表中多余的重复记录(多个字段),只留有rowid最小的记录   
           delete  from  persons  a   
                  where  (a.name,a.id)  in  (select  name,id  from  persons  group  by  name,id  having  count(*) > 1)   
                         and  rowid  not  in  (select  min(rowid)  from  persons  group  by  name,id  having  count(*)> 1 );   
      
    5 、查找表中多余的重复记录(多个字段),不包含rowid最小的记录   
           select  *  from  persons  a   
                    where  (a.name,a.id)  in  (select  name,id  from  persons  group  by  name,id  having  count(*) > 1)   
                            and  rowid  not  in  (select  min(rowid)  from  persons  group  by  name,id  having  count(*)> 1 );   

    展开全文
  • 查找表中多余的重复记录,重复记录根据表中的单个字段来判断 select * from tabA where namein (select name from tabA group by name having count (name) > 1) 二. 删除表中多余重复的记录,只保留其中一条...

    假设有一张tabA的表,以其中的name字段判断是否重复

    一. 查找表中多余的重复记录,重复记录根据表中的单个字段来判断

          select * from tabA  where  name  in (select  name from   tabA  group by   name  having count (name) > 1)

    二. 删除表中多余重复的记录,只保留其中一条

    delete from tabA   where

    name  in (select   name  from tabA  group by   name having count (name) > 1)

    and rowid not in (select min(rowid) from   tabA group by name having count(name)>1)

    展开全文
  • oracle删除一张表中重复数据

    千次阅读 2011-06-22 11:32:00
    --按num分组后找出表中num列重复,即出现次数大于一次 删数据:  delete from student  group by num  having count(num) > 1  这样的话就把所有重复的都删除了...

    delete from QUE_DEPOSITORY dq where dq.depository_id in (select q1.depository_id
      from QUE_DEPOSITORY q1
     where (q1.depository_name, q1.depository_parent_id) in
           (select q2.depository_name, q2.depository_parent_id
              from QUE_DEPOSITORY q2
             group by q2.depository_name, q2.depository_parent_id
            having count(*) > 1) and rowid not in (select min(rowid) from QUE_DEPOSITORY group by depository_name,depository_parent_id having count(*)>1 )and qd.depository_id not in (select cq.depository_id from RELATE_COURSE_QUESTION cq ));

    select q1.*
      from QUE_DEPOSITORY q1
     where (q1.depository_name, q1.depository_parent_id) in
           (select q2.depository_name, q2.depository_parent_id
              from QUE_DEPOSITORY q2
             group by q2.depository_name, q2.depository_parent_id
            having count(*) > 1) and rowid not in (select min(rowid) from QUE_DEPOSITORY group by depository_name,depository_parent_id having count(*)>1 )and q1.depository_id not in (select cq.depository_id from RELATE_COURSE_QUESTION cq );

     

     

     

    1. 我用的SQL语句:
    2. delete from fp_sgfpxx    
      where fphm in (select fphm from fp_sgfpxx group by fphm   having count(fphm) > 1)   
      and rowid not in (select min(rowid) from fp_sgfpxx group by fphm having count(fphm )>1)
    3. 删除重复的发票号码
    4. 查询同一表内多字段同时重复记录的SQL语句   
    5. 来自:7th string   
    6.   
    7.   
    8. 比如现在有一人员表   (表名:peosons)   
    9. 若想将姓名、身份证号、住址这三个字段完全相同的记录查询出来 select    p1.*    from    persons    p1,persons    p2    where    p1.id<>p2.id    and    p1.cardid    =    p2.cardid    and    p1.pname    =    p2.pname    and    p1.address    =    p2.address   
    10. 可以实现上述效果.   
    11. 几个删除重复记录的SQL语句   
    12.       
    13. 1 .用rowid方法   
    14. 2 .用group by方法   
    15. 3 .用distinct方法   
    16.       
    17. 1 。用rowid方法   
    18. 据据Oracle带的rowid属性,进行判断,是否存在重复,语句如下:   
    19. 查数据:   
    20.       select * from table1 a where rowid !=(select    max(rowid)      
    21.       from table1 b where a.name1=b.name1 and a.name2=b.name2......)   
    22. 删数据:   
    23.      delete    from table1 a where rowid !=(select    max(rowid)      
    24.       from table1 b where a.name1=b.name1 and a.name2=b.name2......)   
    25. 2 .group by方法   
    26. 查数据:   
    27.   select count(num), max(name) from student --列出重复的记录数,并列出他的name属性   
    28.   group by num   
    29.   having count(num) > 1 --按num分组后找出表中num列重复,即出现次数大于一次   
    30. 删数据:   
    31.   delete from student   
    32.   group by num   
    33.   having count(num) > 1   
    34.   这样的话就把所有重复的都删除了。   
    35. 3 .用distinct方法 -对于小的表比较有用   
    36. create table table_new as    select distinct *    from table1 minux   
    37. truncate table table1;   
    38. insert into table1 select * from table_new;   
    39.   
    40.   
    41. 查询及删除重复记录的方法大全   
    42.   
    43. 1 、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断   
    44. select * from people   
    45. where peopleId in (select   peopleId   from   people   group   by   peopleId   having   count(peopleId) > 1 )   
    46.   
    47.   
    48. 2 、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录   
    49. delete from people   
    50. where peopleId   in (select   peopleId   from people   group   by   peopleId    having   count(peopleId) > 1 )   
    51. and rowid not in (select min(rowid) from   people   group by peopleId   having count(peopleId )> 1 )   
    52.   
    53.   
    54. 3 、查找表中多余的重复记录(多个字段)   
    55. select * from vitae a   
    56. where (a.peopleId,a.seq) in   (select peopleId,seq from vitae group by peopleId,seq   having count(*) > 1 )   
    57.   
    58.   
    59. 4 、删除表中多余的重复记录(多个字段),只留有rowid最小的记录   
    60. delete from vitae a   
    61. where (a.peopleId,a.seq) in   (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1 )   
    62. and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)> 1 )   
    63.   
    64.   
    65. 5 、查找表中多余的重复记录(多个字段),不包含rowid最小的记录   
    66. select * from vitae a   
    67. where (a.peopleId,a.seq) in   (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1 )   
    68. and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)> 1 )   
    69.   
    70.   
    71. (二)   
    72. 比方说   
    73. 在A表中存在一个字段“name”,   
    74. 而且不同记录之间的“name”值有可能会相同,   
    75. 现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;   
    76. Select Name,Count(*) From A Group By Name Having Count(*) > 1   
    77. 如果还查性别也相同大则如下:   
    78. Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1   
    79.   
    80.   
    81. (三)   
    82. 方法一   
    83. declare @max integer, @id integer   
    84. declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1   
    85. open cur_rows   
    86. fetch cur_rows into @id , @max   
    87. while @ @fetch_status = 0   
    88. begin   
    89. select @max = @max - 1   
    90. set rowcount @max   
    91. delete from 表名 where 主字段 = @id   
    92. fetch cur_rows into @id , @max   
    93. end   
    94. close cur_rows   
    95. set rowcount 0   
    96.   
    97.   
    98. 方法二   
    99. "重复记录"有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。   
    100.   
    101.   
    102.    1 、对于第一种重复,比较容易解决,使用   
    103. select distinct * from tableName   
    104.   就可以得到无重复记录的结果集。   
    105.   如果该表需要删除重复的记录(重复记录保留 1 条),可以按以下方法删除   
    106. select distinct * into #Tmp from tableName   
    107. drop table tableName   
    108. select * into tableName from #Tmp   
    109. drop table #Tmp   
    110.   发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。   
    111.   
    112.   
    113.    2 、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下   
    114.   假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集   
    115. select identity( int , 1 , 1 ) as autoID, * into #Tmp from tableName   
    116. select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID   
    117. select * from #Tmp where autoID in(select autoID from #tmp2)   
    118.   最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)   
    119.   
    120.   
    121. (四)   
    122. 查询重复   
    123. select * from tablename where id in (   
    124. select id from tablename   
    125. group by id   
    126. having count(id) > 1   
    127. )
    128. ===========================
    129. 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢?谢谢!
      1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
      select * from people
      where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)

      2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
      delete from people
      where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
      and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)

      3、查找表中多余的重复记录(多个字段)
      select * from vitae a
      where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

      4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
      delete from vitae a
      where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
      and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

      5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
      select * from vitae a
      where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
      and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

      比方说在A表中存在一个字段“name”,而且不同记录之间的“name”值有可能会相同,
      现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;
      Select Name,Count(*) From A Group By Name Having Count(*) > 1

      如果还查性别也相同大则如下:
      Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1

      2.group by方法

      查数据:
        select count(num), max(name) from student --列出重复的记录数,并列出他的name属性
        group by num
        having count(num) >1 --按num分组后找出表中num列重复,即出现次数大于一次
      删数据:
        delete from student
        group by num
        having count(num) >1
        这样的话就把所有重复的都删除了。

      3.用distinct方法 -对于小的表比较有用

      create table table_new as select distinct * from table1 minux
      truncate table table1;
      insert into table1 select * from table_new;


      delete select a.* from FLRK1 a inner join FLRK1 b on a.记录号=b.记录号 and
      (a.[ID]=b.[ID] and a.入库日期=b.入库日期 and a.操作时间=b.操作时间)

      delete from FLRK1 where 记录号 in
      (select min(记录号) from FLRK1 group by 记录号 having count(记录号)>1)


      A表结构:

      ID RQ SJ C
      --------------------------------------------
      1 2005-07-14 14:20:50 A1
      2 2005-02-15 05:12:23 A1
      3 2005-07-14 14:20:50 A1
      4 2005-06-16 16:16:16 A2
      5 2005-06-16 16:16:16 A2
      6 2005-05-18 05:10:35 A3
      7 2005-02-15 05:12:23 A1

      --------------------------------------------

      求SQL语句一条,把表A中 RQ,SJ,C 三个字段有相同的重复记录删除.

      得到的结果:

      ID RQ SJ C
      --------------------------------------------
      1 2005-07-14 14:20:50 A1
      2 2005-02-15 05:12:23 A1
      4 2005-06-16 16:16:16 A2
      6 2005-05-18 05:10:35 A3
      --------------------------------------------

      Delete from A Where ID Not In (Select Min(ID) from A Group By RQ,SJ,C )

      Delete a from tb a inner join tb as b on a.fid <b.fid and a.c=b.c and a.rq=b.rq and a.sj=b.sj

      delete from A t
      where exists(select 1 from A where ID <A.ID and SJ=t.SJ and RQ=t.RQ and C=t.c)


      方法一

      declare @max integer,@id integer
      declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1
      open cur_rows
      fetch cur_rows into @id,@max
      while fetch_status=0
      begin
      select @max = @max -1
      set rowcount @max
      delete from 表名 where 主字段 = @id
      fetch cur_rows into @id,@max
      end
      close cur_rows
      set rowcount 0

        方法二

        有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。

        1、对于第一种重复,比较容易解决,使用

      select distinct * from tableName


        就可以得到无重复记录的结果集。
        如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除

      select distinct * into #Tmp from tableName
      drop table tableName
      select * into tableName from #Tmp
      drop table #Tmp

        发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

        2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下

        假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集

      select identity(int,1,1) as autoID, * into #Tmp from tableName
      select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
      select * from #Tmp where autoID in(select autoID from #tmp2)

        最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)

    展开全文
  • 一张表中有id和name 两个字段,查询name重复的所有数据,现在列下: select * from xi a where (a.username) in (select username from xi group by username having count(*) > 1) 2、查询所有数据进行...
  • -- SELECT MIN(id) FROM ctydetail GROUP BY originalcode HAVING COUNT(originalcode) > 1 -- SELECT originalcode FROM ctydetail GROUP BY originalcode HAVING COUNT(originalcode) > 1 -- SELECT id FROM cty
  • sql 查出一张表中重复的所有记录数据 1、写一张表中有id和name 两个字段,查询name重复的所有数据,现在列下: select * from xi a where (a.username) ...2、查询所有数据进行分组之后,和重复数据的重复次数的...
  • SELECT V.NUM_ID,V.XMFROM t_MID_RS_PARTY VWHERE V.ZGH IN('060002','100178','120283') SELECT V.ZGHFROM t_MID_RS_PARTY VGROUP BY V.ZGH HAVING COUNT(V.ZGH)> 1 转载于:https://www.cnblogs.com/ko...
  • 1、在面试的时候碰到一个 问题,就是让写一张表中有id和name 两个字段,查询name重复的所有数据,现在列下: select * from xi a where (a.username) in (select username from xi group by username having count...
  • 查出一张表中重复的所有记录数据

    千次阅读 2018-07-31 18:28:02
    1.查出某字段所有重复数据 select * from stu where name in (select name from stu group by name having count(*)&gt;1); 2.查询某字段重复数据以及重复次数 select count(name) as count,name from ...
  • 如何利用sql查找表中重复数据

    千次阅读 2019-11-04 14:29:20
    编写一个SQL查询,查找学生表中所有重复的学生名; 分析思路 1.看到“找重复”的关键字眼,首先要用分组函数(group by),再用聚合函数的计数函数count()给姓名列计数。 2. 分组汇总后,生成了一个如下的。...
  • param(id,paramid,value) 3.value(modelid,paramid,value) 查询相同数据 ,parentid 是modelid的上级 ,param表中有4个属性paramid分别对应的是1 ,4,78,256 每个modelid都有这四个属性,有什么简单的方法...
  • 今天,面试遇到了一道...在user表中,查出name属性值重复2次以上的记录数据。 select * from user t where t.name in (select name from user group by name on having count(name) > 1) 自己的问题,必须改正。
  •  一个比较笨的办法,是先用select查找表中是否已经存在该数据,然后再根据返回的结果决定是否insert。这样做一来效率会降低,二来,如果在select和insert执行期间,又有其他用户进行了insert操作,插入了一条相同...
  • #sql语句查询一张表中某字段值重复记录的数据 select * from 表名 as(起别名) t where t.name in (select name from 表名 group by name having count(name) > 1); ##显示结果
  •  一张person,有id和name的两个字段,id是唯一的不允许重复,id相同则认为是重复的记录。 二、解决  select id from group by id having count(*) > 1  按照id分组并计数,某个id号那一组的数量超过1条则...
  • SQL查询表中重复数据

    2017-10-30 12:01:02
    [code="java"]SQL查询重复数据 有例:emp emp_no name age 001 Tom 17 002 Sun 14 003 Tom 15 004 T...
  • 详解:select id from A a ,(select 表中任意一个等值字段c from A a group by 表中任意一个等值字段c having count(*)>1)b where a.表中任意一个等值字段c=b.表中任意一个等值字段c and a.id in ...
  • MySQL删除一张表中某一字段值的重复记录 delete from 表名 where id in ( select * from ( select id from 表名 where 字段名 in ( # 查找字段值重复的信息 select 字段名 from 表名 group by 字段名 ...
  • 今天,面试遇到了一道公认很...在user表中,查出name属性值重复2次以上的记录数据。select * from user t where t.name in (select name from user group by name on having count(name) > 1)自己的问题,必须改正。
  • 表中的记录随着增多,有些字段的数据重复,这各可以帮你找出重复数据

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 107,237
精华内容 42,894
关键字:

一张表中找出重复数据