如何删除数据库中相同的行???

时间:2021-08-30 22:21:21
如:表Table1中有字段StartDate,但StartDate中有相同的象,如何删除相同的行???

16 个解决方案

#1


不管其他字段吗?

#2


有其它唯一标识一行的列吗?
如果有比如是ID

delete a
from ta a
where exists(select 1 from ta where StartDate = a.StartDate and id < a.id)

#3



declare @tb table(id int identity,StartDate datetime)
insert @tb select
'2009-09-10' union all select
'2009-09-10' union all select
'2009-09-14'

delete  @tb
from @tb t
where exists(select * from @tb where StartDate=t.StartDate and id>t.id)


select * from @tb

id          StartDate
----------- -----------------------
2           2009-09-10 00:00:00.000
3           2009-09-14 00:00:00.000

(2 行受影响)

#4


我这是相当于一个工时录入系统,StartDate是录入的时间,但由于一些问题导致一个表中一个人有两行相同的开始时间,一个人不可能在同一时间做两件事!
但想在我要做工时统计,所以重复的项也被统计了,如何删除这重复的项???

#5


表里面元组很多,我不知道是哪个重复了!
重复的元组如:
personalNO  StartDate 
10716       2009-5-6 12:00:00
10716       2009-5-6 12:00:00
当然还有其他列,其他列的值不同

#6


引用 2 楼 happyflystone 的回复:
有其它唯一标识一行的列吗?
如果有比如是ID

delete a
from ta a
where exists(select 1 from ta where StartDate = a.StartDate and id < a.id)
     顶

#7


有唯一的标志列不?
比如自增列?

#8


引用 2 楼 happyflystone 的回复:
有其它唯一标识一行的列吗?
如果有比如是ID

delete a
from ta a
where exists(select 1 from ta where StartDate = a.StartDate and id < a.id)


有ID是唯一标示,我去试试!

#9



--创建临时表#保存不重复记录   
  select   distinct   *   into   #test   from  warehouse
  --删除源表的所有记录   
  delete   from  warehouse
  --从临时表插入数据到源表,下面的语句根据需要,列出字段替换...   
  insert   into  warehouse
  select   *
  from   #test
  --删除临时表#   
  drop   table   #test
  go

#10


取标识列最大或最小的保留,其他删掉就好了

#11



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

2条一样的数据只能删除一条!

#12


2楼的方法很简练啊

#13


引用 9 楼 tdtxflsh 的回复:
--创建临时表#保存不重复记录 
  select  distinct  *  into  #test  from  warehouse
  --删除源表的所有记录 
  delete  from  warehouse
  --从临时表插入数据到源表,下面的语句根据需要,列出字段替换... 
  insert  into  warehouse
  select  *
  from  #test
  --删除临时表# 
  drop  table  #test
  go


楼主说有自增列ID,删除源表记录里,用transcate table,可以ID重新开始

#14


1.将存在相同的记录查出into到临时表
2.删除存在相同字段值的记录
3.将临时表中的记录对每一不同的值取第一条插入

#15


引用 2 楼 happyflystone 的回复:
有其它唯一标识一行的列吗?
如果有比如是ID

delete a
from ta a
where exists(select 1 from ta where StartDate = a.StartDate and id < a.id)

顶一个

#16


--楼主:能不能先把你那“相同”的标准说明白啊?\
--表中:记录的哪些字段相同时,就视为相同(重复)行呢?
--没个标准,你叫人家怎么回答啊?

#1


不管其他字段吗?

#2


有其它唯一标识一行的列吗?
如果有比如是ID

delete a
from ta a
where exists(select 1 from ta where StartDate = a.StartDate and id < a.id)

#3



declare @tb table(id int identity,StartDate datetime)
insert @tb select
'2009-09-10' union all select
'2009-09-10' union all select
'2009-09-14'

delete  @tb
from @tb t
where exists(select * from @tb where StartDate=t.StartDate and id>t.id)


select * from @tb

id          StartDate
----------- -----------------------
2           2009-09-10 00:00:00.000
3           2009-09-14 00:00:00.000

(2 行受影响)

#4


我这是相当于一个工时录入系统,StartDate是录入的时间,但由于一些问题导致一个表中一个人有两行相同的开始时间,一个人不可能在同一时间做两件事!
但想在我要做工时统计,所以重复的项也被统计了,如何删除这重复的项???

#5


表里面元组很多,我不知道是哪个重复了!
重复的元组如:
personalNO  StartDate 
10716       2009-5-6 12:00:00
10716       2009-5-6 12:00:00
当然还有其他列,其他列的值不同

#6


引用 2 楼 happyflystone 的回复:
有其它唯一标识一行的列吗?
如果有比如是ID

delete a
from ta a
where exists(select 1 from ta where StartDate = a.StartDate and id < a.id)
     顶

#7


有唯一的标志列不?
比如自增列?

#8


引用 2 楼 happyflystone 的回复:
有其它唯一标识一行的列吗?
如果有比如是ID

delete a
from ta a
where exists(select 1 from ta where StartDate = a.StartDate and id < a.id)


有ID是唯一标示,我去试试!

#9



--创建临时表#保存不重复记录   
  select   distinct   *   into   #test   from  warehouse
  --删除源表的所有记录   
  delete   from  warehouse
  --从临时表插入数据到源表,下面的语句根据需要,列出字段替换...   
  insert   into  warehouse
  select   *
  from   #test
  --删除临时表#   
  drop   table   #test
  go

#10


取标识列最大或最小的保留,其他删掉就好了

#11



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

2条一样的数据只能删除一条!

#12


2楼的方法很简练啊

#13


引用 9 楼 tdtxflsh 的回复:
--创建临时表#保存不重复记录 
  select  distinct  *  into  #test  from  warehouse
  --删除源表的所有记录 
  delete  from  warehouse
  --从临时表插入数据到源表,下面的语句根据需要,列出字段替换... 
  insert  into  warehouse
  select  *
  from  #test
  --删除临时表# 
  drop  table  #test
  go


楼主说有自增列ID,删除源表记录里,用transcate table,可以ID重新开始

#14


1.将存在相同的记录查出into到临时表
2.删除存在相同字段值的记录
3.将临时表中的记录对每一不同的值取第一条插入

#15


引用 2 楼 happyflystone 的回复:
有其它唯一标识一行的列吗?
如果有比如是ID

delete a
from ta a
where exists(select 1 from ta where StartDate = a.StartDate and id < a.id)

顶一个

#16


--楼主:能不能先把你那“相同”的标准说明白啊?\
--表中:记录的哪些字段相同时,就视为相同(重复)行呢?
--没个标准,你叫人家怎么回答啊?