怎么写一条SQL语句删除因某一字段内容相同而多余的记录?

时间:2021-08-29 15:13:22
怎么写一条SQL语句删除因某一字段内容相同而多余的记录?

28 个解决方案

#1


一条可能办不到,至少需要两条。

#2


某一字段内容相同到底哪条是多余的呀?

#3


一条语句不可能写出,要写一个存储过程。

#4


TO :Wingsun
  求教一下,两条怎么写.
to Tyro:
  只要保留一条即可,随便哪一条.

#5



select * from table where field='a'
取得某一条的一些值
然后
delete * from table where Field='a' And (Field1<>'d'....)

#6


to Wingsun:
  你误解了我,我的数据库里有大量的重复数据.我用程序来完成这个功能是没有问题的,只是我想知道有没有简接一些的方法,因为我知道高手们解决问题通常都是三下两下就可以搞定.

#7


关注

#8


各位大侠有什么办法没有?

#9


问一下,你的表中有没有唯一性的字段?

#10


如果有的话应该一句话就能出来的。

#11


一条语句和多条语句有区别么?
一条语句的执行效率就高么?要实现你这个功能,就是有一条语句能实现
该语句的执行效率也不会比上面wingsun说的方法效率高。
高手并不体现在能够写"一条语句"就能执行的sql,而是考虑到编程速度和
sql 执行效率的程序员

#12


我觉得szdino的说法欠妥,对程序员来说怎么把SQL写好肯定是应该考虑的问题,能用一条语句能实现为什么非要通过若干语句或者一段程序来实现呢?

#13


要不建一个临时库,把其中一条写到库中,剩余的全部删除

#14


to TopHead:
  有唯一字段,那条语句怎么写!
to hcat1999:
关键是要简单,建一个临时库也行,你打算怎么做.
to szdino:
   wingsun的办法没解决问题!

我本来有两个办法:
  1.PB的数据管道,建一个临时表把重复字段设为主键,来回倒两下就行了.
  2.也是建一个临时表把重复字段设为主键,然后用INSERT把数据查进来,再把该表
    内容清除,把临时表内容插进来即可.
只是这两个办法让我觉得不怎么好.

#15


在oracle中我是这样做的

Identify duplicate records: 

select   COL1, COL2, COL#, COUNT(*)
from     <OWNER>.<TABLE_NAME>
group by COL1, COL2, COL#
having   count(*) > 1;

Remove duplicate records: 

delete   from <OWNER>.<TABLE_NAME> a
where    rowid < (
         select  max(rowid) 
         from    <OWNER>.<TABLE_NAME> b
         where   b.COL1 = a.COL1
         and     b.COL2 = a.COL2
         and     b.COL# = a.COL#); 

#16


假定:
表(命名为tbl)中有一列(命名为sn)是唯一的(如果没有,不妨加一个没有对应业务意义的列,设置为自动增长的整数)
表中有内容重复的列为dup

我的解决思路如下:
筛选出dup列不重复的行,得到这些行的sn值,然后删除这些sn值以外的所有行。

DELETE tbl WHERE code NOT IN
(SELECT MIN(sn) FROM tbl GROUP BY dup)

#17


对不起,code应该改为 sn

#18


对不起, code改为sn

#19


对不起,code应改为sn

#20


假设唯一字段是F1,有相同记录的字段叫F2,应该可以这么写吧:

delete from TableName where F1 not in (select max(F1) from TableName where F2='value')

#21


你是只保留其中一条,还是全部删掉

#22


全部删掉,可以这样写

  DELETE FROM TableName
  WHERE FieldName IN
   (SELECT FieldName FROM TableName
    GROUP BY FieldName
    HAVING COUNT(*) > 1)

#23


最简单的方法如下:(假设title列和detail列有重复数据,在SQL Server 7.0)
1.建一个表结构相同的新表.
2.创建唯一型索引(应用IGNORE_DUP_KEY选项)
  如你所说的表,建唯一约束如下:
  CREATE UNIQUE INDEX [INDEX_NAME] ON [TABLE_NAME](title,detail)
  WITH IGNORE_DUP_KEY
3.用insert ... select命令生成新表中的行.
结果就是在新表中删除了重复行.

如果觉得有用的话,请给我加分.

#24


假设唯一字段是F1,有相同记录的字段叫F2,应该可以这么写吧:

delete from TableName 
where F1 not in (select min(F1) from TableName group by F2)

如果觉得有用的话,请给我加分

#25


我同意szdino的说法,写程序不仅只需考虑效率问题,在c/s模式下还需考虑系统锁定问题、网络传输问题。而且退一万步来说,一条语句不一定就比多条语句执行效率高。

#26


我在Oracle中是这样做的:
以Emp为例(Empno是唯一字段):
DELETE Emp WHERE ROWID <> (
   SELECT MAX(ROWID) FROM Emp E WHERE Emp.Empno = E.Empno);
即可删除Emp表中Empno重复的数据而只留下一条。
如果唯一条件是多个字段将字段并在WHERE条件后即可。

#27


咦???
这个问题怎又出来了,我昨天的回答肯定可以解决问题,
除非你用的是非Oralce数据库.

#28


谢谢大家,迟了两天答复,有这么多答案,其中HAIHONG,FXX,ZHENYUFENG的答案
最优!

#1


一条可能办不到,至少需要两条。

#2


某一字段内容相同到底哪条是多余的呀?

#3


一条语句不可能写出,要写一个存储过程。

#4


TO :Wingsun
  求教一下,两条怎么写.
to Tyro:
  只要保留一条即可,随便哪一条.

#5



select * from table where field='a'
取得某一条的一些值
然后
delete * from table where Field='a' And (Field1<>'d'....)

#6


to Wingsun:
  你误解了我,我的数据库里有大量的重复数据.我用程序来完成这个功能是没有问题的,只是我想知道有没有简接一些的方法,因为我知道高手们解决问题通常都是三下两下就可以搞定.

#7


关注

#8


各位大侠有什么办法没有?

#9


问一下,你的表中有没有唯一性的字段?

#10


如果有的话应该一句话就能出来的。

#11


一条语句和多条语句有区别么?
一条语句的执行效率就高么?要实现你这个功能,就是有一条语句能实现
该语句的执行效率也不会比上面wingsun说的方法效率高。
高手并不体现在能够写"一条语句"就能执行的sql,而是考虑到编程速度和
sql 执行效率的程序员

#12


我觉得szdino的说法欠妥,对程序员来说怎么把SQL写好肯定是应该考虑的问题,能用一条语句能实现为什么非要通过若干语句或者一段程序来实现呢?

#13


要不建一个临时库,把其中一条写到库中,剩余的全部删除

#14


to TopHead:
  有唯一字段,那条语句怎么写!
to hcat1999:
关键是要简单,建一个临时库也行,你打算怎么做.
to szdino:
   wingsun的办法没解决问题!

我本来有两个办法:
  1.PB的数据管道,建一个临时表把重复字段设为主键,来回倒两下就行了.
  2.也是建一个临时表把重复字段设为主键,然后用INSERT把数据查进来,再把该表
    内容清除,把临时表内容插进来即可.
只是这两个办法让我觉得不怎么好.

#15


在oracle中我是这样做的

Identify duplicate records: 

select   COL1, COL2, COL#, COUNT(*)
from     <OWNER>.<TABLE_NAME>
group by COL1, COL2, COL#
having   count(*) > 1;

Remove duplicate records: 

delete   from <OWNER>.<TABLE_NAME> a
where    rowid < (
         select  max(rowid) 
         from    <OWNER>.<TABLE_NAME> b
         where   b.COL1 = a.COL1
         and     b.COL2 = a.COL2
         and     b.COL# = a.COL#); 

#16


假定:
表(命名为tbl)中有一列(命名为sn)是唯一的(如果没有,不妨加一个没有对应业务意义的列,设置为自动增长的整数)
表中有内容重复的列为dup

我的解决思路如下:
筛选出dup列不重复的行,得到这些行的sn值,然后删除这些sn值以外的所有行。

DELETE tbl WHERE code NOT IN
(SELECT MIN(sn) FROM tbl GROUP BY dup)

#17


对不起,code应该改为 sn

#18


对不起, code改为sn

#19


对不起,code应改为sn

#20


假设唯一字段是F1,有相同记录的字段叫F2,应该可以这么写吧:

delete from TableName where F1 not in (select max(F1) from TableName where F2='value')

#21


你是只保留其中一条,还是全部删掉

#22


全部删掉,可以这样写

  DELETE FROM TableName
  WHERE FieldName IN
   (SELECT FieldName FROM TableName
    GROUP BY FieldName
    HAVING COUNT(*) > 1)

#23


最简单的方法如下:(假设title列和detail列有重复数据,在SQL Server 7.0)
1.建一个表结构相同的新表.
2.创建唯一型索引(应用IGNORE_DUP_KEY选项)
  如你所说的表,建唯一约束如下:
  CREATE UNIQUE INDEX [INDEX_NAME] ON [TABLE_NAME](title,detail)
  WITH IGNORE_DUP_KEY
3.用insert ... select命令生成新表中的行.
结果就是在新表中删除了重复行.

如果觉得有用的话,请给我加分.

#24


假设唯一字段是F1,有相同记录的字段叫F2,应该可以这么写吧:

delete from TableName 
where F1 not in (select min(F1) from TableName group by F2)

如果觉得有用的话,请给我加分

#25


我同意szdino的说法,写程序不仅只需考虑效率问题,在c/s模式下还需考虑系统锁定问题、网络传输问题。而且退一万步来说,一条语句不一定就比多条语句执行效率高。

#26


我在Oracle中是这样做的:
以Emp为例(Empno是唯一字段):
DELETE Emp WHERE ROWID <> (
   SELECT MAX(ROWID) FROM Emp E WHERE Emp.Empno = E.Empno);
即可删除Emp表中Empno重复的数据而只留下一条。
如果唯一条件是多个字段将字段并在WHERE条件后即可。

#27


咦???
这个问题怎又出来了,我昨天的回答肯定可以解决问题,
除非你用的是非Oralce数据库.

#28


谢谢大家,迟了两天答复,有这么多答案,其中HAIHONG,FXX,ZHENYUFENG的答案
最优!