詳解如何刪除SQL Server表中的重復(fù)行
如果表中有多組完全不同的重復(fù)的 PK 值,則逐個(gè)刪除它們會(huì)很費(fèi)時(shí)間。在這種情況下,可使用下面的方法:
1.首先,運(yùn)行上面的 GROUP BY 查詢來確定有多少組重復(fù)的 PK 值及每組的重復(fù)數(shù)。
2.選擇重復(fù)的鍵值放入臨時(shí)表中。例如:
SELECT col1, col2, col3=count(*) |
3.選擇重復(fù)的行放入臨時(shí)表中,以清除進(jìn)程中的重復(fù)值。例如:
SELECT DISTINCT t1.* |
4.此時(shí),holddups 表應(yīng)有唯一的 PK;但是,如果 t1 有重復(fù)的 PK 而行唯一(如上面的 SSN 示例),情況就不是這樣了。請(qǐng)驗(yàn)證 holddups 中的各個(gè)鍵是否唯一,是否沒有鍵重復(fù)而行唯一的情況。如果是這樣,您必須停在該處,確定對(duì)于給定重復(fù)的鍵值,您希望保留哪些行。例如,以下查詢:
SELECT col1, col2, count(*) |
應(yīng)為各行返回計(jì)數(shù) 1。如果結(jié)果是 1,請(qǐng)繼續(xù)執(zhí)行下面的步驟 5。如果不是 1,則存在鍵重復(fù)而行唯一的情況,且需要您決定要保存哪些行。通常,這將需要舍棄行或?yàn)榇诵袆?chuàng)建新的唯一的鍵值。為 holddups 表中每個(gè)此種重復(fù) PK 執(zhí)行這兩個(gè)步驟之一。
5.從原始表中刪除重復(fù)的行。例如:
DELETE t1 |
6.將唯一行放回原始表中。例如:
INSERT t1 SELECT * FROM holddups |
【編輯推薦】