SQL删除具有相同ID的记录,留下1

时间:2011-04-21 11:10:50

标签: sql sql-delete

奇怪的问题,我知道。我不想删除所有行并重新开始,但我们有一个开发数据库表,其中一些行具有重复的ID,但值不同。

我想删除所有ID重复的记录,因此我可以在表上强制新版本和构建关系的数据完整性。目前它是由代码(遗留)插入和生成的ID。

从另一个问题我得到了这个:

delete 
   t1 
from 
   tTable t1, tTable t2 
where 
   t1.locationName = t2.locationName and  
   t1.id > t2.id

但这不起作用,因为ID是相同的!

如何删除除ID之外的所有记录?也就是说,删除具有相同ID的记录的数量> 1?如果那是不可能的,那么删除所有ID重复的记录就可以了。

3 个答案:

答案 0 :(得分:1)

取决于您的数据库服务器,但您可以关联DELETE和LIMIT(mysql)或TOP(sql server)。

您还可以将每个记录的第一个(不是重复的)移动到临时表,删除原始表并将临时表复制回原始表。

答案 1 :(得分:1)

SQL Server 2005及以上:

WITH    q AS
        (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY locationName ORDER BY id) rn
        FROM    tTable
        )
DELETE
FROM    q
WHERE   rn > 1

答案 2 :(得分:1)

对于mysql不确定,但对于MSServer数据库,您可以使用以下

SET IDENTITY_INSERT [tablename] ON
SELECT DISTINCT col1, col2, col3 INTO temp_[tablename] FROM [tablename]
ALTER TABLE temp_[tablename] ADD IDcol INT IDENTITY
TRUNCATE TABLE [tablename]
INSERT INTO [tablename](IDcol, col1, col2, col3) SELECT IDcol, col1, col2, col3 FROM temp_[tablename]
DROP TABLE temp_[tablename]

希望这有帮助。