首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 如何删除数据库中重复纪录 [已结贴,结贴人:wangxiao2008]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-17 12:05:35 楼主
    数据库1的表1中存在重复记录,如何把重复的记录删除?
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-17 12:08:081楼 得分:4
    SQL code
    delete a from table1 a where not exists( select 1 from table1 where col = a.col and id > a.id)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-17 12:08:082楼 得分:3
    如果存在完全重复的记录:

    SQL code
    select distinct * into # fromdeleteinsert intoselect * from # drop table #
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hackztx
    • 等级:
    发表于:2008-04-17 12:09:263楼 得分:2
    SQL code
    create table test ( PKID int primary key identity(1,1), Name varchar(30) ) insert into test select '张三' union all select '李四' union all select '李四' select * from test delete test where PKID not in (select min(PKID) from test group by name) select * from test
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-17 12:55:464楼 得分:0
    怎摸没人?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dawugui
    • 等级:
    发表于:2008-04-17 12:58:445楼 得分:4
    --如何按字段删除重复记录

    一张表里面以两个字段为唯一字段,当几条记录的这两个字段完全相同时,需要删除重复项,如下表
    a b c d
    1 2 3 4
    1 5 3 5
    1 2 7 9
    以a、b为唯一字段,第一条和第三条的a、b完全相同,所以,需要删除第一条记录1 2 3 4 或者第三条记录1 2 7 9
    即如下结果:
    a b c d
    1 2 3 4
    1 5 3 5

    a b c d
    1 5 3 5
    1 2 7 9

    请问各位大侠这种sql语句怎么写


    CREATE TABLE Tb1(id int, [a] varchar(255), [b] varchar(255), [c] varchar(255), [d] varchar(255))
    INSERT Tb1(id, [a], [b], [c], [d])
              SELECT 1, '1','2','3','4'
    UNION ALL  SELECT 2, '1','5','3','5'
    UNION ALL  SELECT 3, '1','2','7','9'
    UNION ALL  SELECT 4, '1','4','7','6'

    delete Tb1 where [id] not in (select max([id]) from Tb1 group by a,b )
    select * from tb1

    drop table tb1

    如果要同时删除第一和第三行
    即如下结果:
    a b c d
    1 5 3 5

    语句如下:

    delete m from tb t
    inner join
    (
    select a ,b
    from tb
    group by a , b
    having count(*)>1
    )n
    on m.a = n.a and m.b = n.b

    delete * from tb as m,
    (
    select a ,b
    from tb
    group by a , b
    having count(*)>1
    )n
    where m.a = n.a and m.b = n.b


    ------------------------------------------------------------------------------------
    在几千条记录里,存在着些相同的记录,如何能用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
    ------------------------------------------------------------------------------------------------
    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子句中省去此列)
    select * from tablename where id in (
    select id from tablename
    group by id
    having count(id) > 1)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-17 13:02:416楼 得分:0
    顶一下真的好长好全啊。
    引用 5 楼 dawugui 的回复:
    --如何按字段删除重复记录

    一张表里面以两个字段为唯一字段,当几条记录的这两个字段完全相同时,需要删除重复项,如下表
    a b c d
    1 2 3 4
    1 5 3 5
    1 2 7 9
    以a、b为唯一字段,第一条和第三条的a、b完全相同,所以,需要删除第一条记录1 2 3 4 或者第三条记录1 2 7 9
    即如下结果:
    a b c d
    1 2 3 4
    1 5 3 5

    a b c d
    1 5 3 5
    1 2 7 9

    请问各位大侠这种sql语句怎么写


    CREATE TABLE Tb1…
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-17 13:17:227楼 得分:0
    select  库1.dbo.表1.*  into T_1
    from  库1.dbo.表1,库2.dbo.表2
    where (库1.dbo.表1.id=库2.dbo.表2.id1)
    truncate table 库1.dbo.表1
    insert into 库1.dbo.表1
    select *
    from T_1

    如上语句怎摸把表1中的重复语句删掉??
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-17 13:36:448楼 得分:0
    至:子陌红尘
    select distinct * into # from 表
    delete 表
    insert into 表 select * from #
    drop table #
    这种方法运行报错:消息 421,级别 16,状态 1,第 1 行
    ntext 数据类型不能选为 DISTINCT,因为它不可比。
    消息 421,级别 16,状态 1,第 1 行
    ntext 数据类型不能选为 DISTINCT,因为它不可比。
    消息 421,级别 16,状态 1,第 1 行
    ntext 数据类型不能选为 DISTINCT,因为它不可比。
    消息 421,级别 16,状态 1,第 1 行
    ntext 数据类型不能选为 DISTINCT,因为它不可比。
    消息 421,级别 16,状态 1,第 1 行
    ntext 数据类型不能选为 DISTINCT,因为它不可比。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-17 19:46:439楼 得分:0
    perfect
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-17 22:40:2410楼 得分:0
    5楼大师说的精彩
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-17 23:33:1511楼 得分:1

    select distinct * into 表 from 有重复的表
    再删除有重复的表的记录
    再将into到的表的数据插入到原来有重复记录的表中.
    再删除into表
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • conan304
    • 等级:
    发表于:2008-04-18 11:17:5912楼 得分:2
    SQL code
    select distinct * into # from tableName truncate tableName insert tableName select * from # drop table #
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-18 11:50:5113楼 得分:0
    呵呵 顶一下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-18 13:01:3314楼 得分:2
    也帖段出来虽然没有5楼的大师来的精彩

    2)删除两条数据库中一模一样的记录
    在建表时应设置一个唯一标识符(一般用IDENTITY用系统产生整型的自增长序列号,格式为IDENTITY ( seed , increment )),即便是有重复记录也能通过唯一标识符找到并处理掉。若没有该字段能够破坏原先表结构的可以用插入字段的方式来处理。
    如:
    alter table tb add  idx int IDENTITY (1,1)
    如果表的数据量不大且允许删除重建那么可以使用
      select  distinct  *  into  #temptable  from  yourtable 
      delete  table  yourtable 
      insert  yourtable  select  *  from  #temptable
    如果不允许表删除重建则只能用变量,删除重复记录,可用Having语句可以找出两条相同的记录
    create proc delchongfu
    as
    select * into  #temptable from item group by userindex,avatarindex,ItemUUID  having count(*)>1
    delete from item where userindex in (select userindex from  #temptable)
    insert into item select * from #temptable
    上诉语句也有问题,因为他要注意要匹配的字段必须具有一定的唯一性,否则会存在问题,可能会多删除部分记录。因此要被所有字段都进行匹配。

    create proc newdelchongfu
    as
    select * into  #temptable from item group by userindex,avatarindex,ItemUUID  having count(*)>1
    delete item from item as i,#temptable as t where i.userindex=t.userindex and  i.avatarindex=t.avatarindex and i.ItemUUID=t.ItemUUID
    insert into item select * from #temptable

    在SQL server 2005也可以通过row_number()只是生成了新的查询结果,并不会对表中的原有数据造成影响因此无法通过这一函数确切的删除表中的重复列

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-22 10:22:3615楼 得分:1
    select distinct * into # from tableName
    truncate tableName
    insert tableName select * from #
    drop table #
    顶一下这个
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-22 10:30:5116楼 得分:1
    要看你的表的结构
    如果有所有字段完全相同的记录
    可以用
    select * into xxxx1 from xxxx
    group by 所有字段
    是最简单的方法
    但是如果表数据多会很慢
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-23 08:35:5117楼 得分:0
    弱弱的mark一下
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved