如何删除表中相同记录??(50分)

  • 主题发起人 主题发起人 snappy
  • 开始时间 开始时间
S

snappy

Unregistered / Unconfirmed
GUEST, unregistred user!
如一个表有如下字段:
姓名,代号,其它

但其中可能姓名有三个叫李四的,那么我如何删除其中二个而保留一个呢???

SQL中有这样一条语句:
SELECT DISTINCT ...
它可以排除相同记录,我如何把查询的结果保存至另一数据表呢????
 
select into 新表...
 
删除其中一个是不可能的,如果几条记录是完全一样的话。
无论使用Table还是Query
select distinct * from table
然后把结果放入一个临时表,把现在的表删空,再把临时表的内容写回来倒是一个变通的办法
 
insert into new_table(name,id,other)
select distinct name,id,other from old_table
where .... ;
 
因为无法上机试验,请大家帮我看一下楼上说的方法是否可行?谢谢!
 
delete table where 姓名 = 李四 and rownum < 3
 
应该是先进行筛选:select distinct from table
然后再放入一个临时表就可以了
 
select count(*) as mcount from table1 where name='李四'
get count as: icount = rec.fields[0].asinteger - 1

delete from table1 where code in (select top icount code from table1 where name='李四')
 
要是能这么写:delete table where 姓名 = 李四 and rownum < 3
那这样写应该更合适:delete table where 姓名 = 李四 and rownum >1
因为删除前是不知道 3 的。这样看数据库是不是支持行号或记录号。

如果不支持行号或记录号,而且要用一条语句完成,在其它列不同的情况下
可以使用子查询:anotherfield 为值不同的列。原理是和上面一样的。

delete table where 姓名 = '李四'
and anotherfield<>(select top 1 anotherfield from table)
 
to jsxjd:
很遗憾的是 delete table where 姓名 = 李四 and rownum < 3 可以正确执行
而 delete table where 姓名 = 李四 and rownum >1 却不能正确执行(对于oracle数据库)

由于具体的行数不能预先知道,所以我觉得可以用子查询来确定,如下:
delete table where 姓名 = 李四 and rownum < (select count(*) where 姓名 = 李四 )

 
由于这是一星期后要做的工作,所以现在先提出了问题,客户资料没有
到手所以也无法试验。

有确认的答案吗??
 
其实两者都可以实现的阿。
不过使用删除的方式,不能用一条语句就搞定(我的水平有限)。
我的思路是:
query1 执行 select distinct name from your_table; 找出所有姓名
while(not query1.eof)
begin
//逐个删除相同姓名的记录
query2 执行 delete from your_table where name= query1('name') and
rownum< (select count(*) from your_table where name= query1('name') )
end;

和临时表比起来,好像是麻烦了一点。就看你的需要了。
 
竟有此事,那“rownum”是什么????
 
delete table where 姓名 = 李四 and rownum < 3
我这样写是因为知道表中姓名 = 李四 的记录有3条,若不知道记录,可count一下,
select count(*) from table where 姓名 = 李四,
或象huntor所写:
delete table where 姓名 = 李四 and rownum < (select count(*) where 姓名 = 李四 )
以上语句在oracle中肯定能通过,因我经常用。
 
多人接受答案了。
 
后退
顶部