2011-04-21 66 views
2

奇怪的問題,我知道。我不想刪除所有行並重新開始,但我們有一個開發數據庫表,其中一些行具有重複的ID,但具有不同的值。SQL刪除具有相同ID的記錄,只留下1

我想刪除所有具有重複ID的記錄,這樣我就可以強制在表上爲新版本建立關係的數據完整性。目前它是一個由代碼插入和生成的ID(遺留)。

從另一個問題,我得到這個:

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

但是,這將無法正常工作的ID都是一樣的!

如何刪除ID相同的一條記錄?即,刪除具有相同ID> 1的記錄的計數的位置?如果這是不可能的,那麼刪除所有具有重複ID的記錄就可以。

+0

你使用哪個dbms? – 2011-04-21 11:13:00

+0

@Ash sql server 2005 – 2011-04-21 11:18:20

+0

你想擺脫'id'或'locationName'上的重複嗎? – Quassnoi 2011-04-21 11:28:11

回答

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 
1

取決於您的數據庫服務器,但您可以關聯DELETE和LIMIT(mysql)或TOP(sql server)。

您也可以將每個記錄的第一個(不重複)移動到臨時表中,刪除原始表並將臨時表複製回原始表。

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] 

希望這有助於。

相關問題