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

ljd 2000-07-25 05:01:00
怎么写一条SQL语句删除因某一字段内容相同而多余的记录?
...全文
4451 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljd 2000-07-28
  • 打赏
  • 举报
回复
谢谢大家,迟了两天答复,有这么多答案,其中HAIHONG,FXX,ZHENYUFENG的答案
最优!
Fxx 2000-07-28
  • 打赏
  • 举报
回复
咦???
这个问题怎又出来了,我昨天的回答肯定可以解决问题,
除非你用的是非Oralce数据库.
pjy 2000-07-27
  • 打赏
  • 举报
回复
我同意szdino的说法,写程序不仅只需考虑效率问题,在c/s模式下还需考虑系统锁定问题、网络传输问题。而且退一万步来说,一条语句不一定就比多条语句执行效率高。
Fxx 2000-07-27
  • 打赏
  • 举报
回复
我在Oracle中是这样做的:
以Emp为例(Empno是唯一字段):
DELETE Emp WHERE ROWID <> (
SELECT MAX(ROWID) FROM Emp E WHERE Emp.Empno = E.Empno);
即可删除Emp表中Empno重复的数据而只留下一条。
如果唯一条件是多个字段将字段并在WHERE条件后即可。
mimosa 2000-07-27
  • 打赏
  • 举报
回复
假设唯一字段是F1,有相同记录的字段叫F2,应该可以这么写吧:

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

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

mimosa 2000-07-27
  • 打赏
  • 举报
回复
最简单的方法如下:(假设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命令生成新表中的行.
结果就是在新表中删除了重复行.

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

none 2000-07-26
  • 打赏
  • 举报
回复
对不起,code应改为sn
none 2000-07-26
  • 打赏
  • 举报
回复
对不起, code改为sn
none 2000-07-26
  • 打赏
  • 举报
回复
对不起,code应该改为 sn
none 2000-07-26
  • 打赏
  • 举报
回复
假定:
表(命名为tbl)中有一列(命名为sn)是唯一的(如果没有,不妨加一个没有对应业务意义的列,设置为自动增长的整数)
表中有内容重复的列为dup

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

DELETE tbl WHERE code NOT IN
(SELECT MIN(sn) FROM tbl GROUP BY dup)
haihong 2000-07-26
  • 打赏
  • 举报
回复
在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#);
ljd 2000-07-26
  • 打赏
  • 举报
回复
to TopHead:
有唯一字段,那条语句怎么写!
to hcat1999:
关键是要简单,建一个临时库也行,你打算怎么做.
to szdino:
wingsun的办法没解决问题!

我本来有两个办法:
1.PB的数据管道,建一个临时表把重复字段设为主键,来回倒两下就行了.
2.也是建一个临时表把重复字段设为主键,然后用INSERT把数据查进来,再把该表
内容清除,把临时表内容插进来即可.
只是这两个办法让我觉得不怎么好.
hcat1999 2000-07-26
  • 打赏
  • 举报
回复
要不建一个临时库,把其中一条写到库中,剩余的全部删除
TopHead 2000-07-26
  • 打赏
  • 举报
回复
我觉得szdino的说法欠妥,对程序员来说怎么把SQL写好肯定是应该考虑的问题,能用一条语句能实现为什么非要通过若干语句或者一段程序来实现呢?
szdino 2000-07-26
  • 打赏
  • 举报
回复
一条语句和多条语句有区别么?
一条语句的执行效率就高么?要实现你这个功能,就是有一条语句能实现
该语句的执行效率也不会比上面wingsun说的方法效率高。
高手并不体现在能够写"一条语句"就能执行的sql,而是考虑到编程速度和
sql 执行效率的程序员
TopHead 2000-07-26
  • 打赏
  • 举报
回复
如果有的话应该一句话就能出来的。
TopHead 2000-07-26
  • 打赏
  • 举报
回复
问一下,你的表中有没有唯一性的字段?
ljd 2000-07-26
  • 打赏
  • 举报
回复
各位大侠有什么办法没有?
zengyufeng 2000-07-26
  • 打赏
  • 举报
回复
全部删掉,可以这样写

DELETE FROM TableName
WHERE FieldName IN
(SELECT FieldName FROM TableName
GROUP BY FieldName
HAVING COUNT(*) > 1)
zengyufeng 2000-07-26
  • 打赏
  • 举报
回复
你是只保留其中一条,还是全部删掉
加载更多回复(8)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧