2012-08-02 52 views
0

請假設我有一個包含特定未指定數量列的表。刪除完全重複的行,只留下其中一個

我想刪除完全重複的行,這意味着行中所有列匹配相等,而不重複,只保留1行。

我怎麼能做到這一點?

例如:SQL Server 2005中,表5列FIELD1, FIELD2, FIELD3, FIELD4, FIELD5

5 3 2 A J 
3 5 2 A J 
5 3 2 A J 
5 3 2 A J 
8 B 8 A K 

第一排,第三排和第四排是重複的,所以你必須在表中只留下其中之一。

+1

您可能會考慮添加'SQL'和'SQL-SERVER'標籤來吸引更多的觀衆:-) – 2012-08-02 13:02:38

+0

非常感謝您的友好建議 – UltraCommit 2012-08-02 13:07:14

回答

1

您可能會使用row_number()將數字分配給重複項並刪除rn大於1(單個出現或第一個重複項)。

一個小的測試,由於SQL小提琴不可用ATM:

declare @t table (FIELD1 varchar(10), FIELD2 varchar(10), FIELD3 varchar(10), FIELD4 varchar(10), FIELD5 varchar(10)) 

insert into @t values ('5', '3', '2', 'A', 'J') 
insert into @t values ('3', '5', '2', 'A', 'J') 
insert into @t values ('5', '3', '2', 'A', 'J') 
insert into @t values ('5', '3', '2', 'A', 'J') 
insert into @t values ('8', 'B', '8', 'A', 'K') 

; with g as (
    select *, 
     row_number() over (partition by field1, field2, field3, field4, field5 
          order by (select null)) rn 
    from @t 
) 
delete g 
where rn > 1 

select * 
from @t 

的缺點是,你必須指定所有列。如果您想避免這種情況,並且您的表沒有外鍵並且沒有被任何引用,您可以將DISTINCT數據插入臨時表,TRUNCATE原始數據並從臨時表中重新插入。

+0

好的,但臨時表需要創建空間,所以在某些情況下如果生產環境沒有足夠的空間來創建它,那不是可能的。也有可能您沒有足夠的權限來創建新表。謝謝你的代碼;-) – UltraCommit 2012-08-02 13:08:48

+1

@UltraCommit不客氣:-) – 2012-08-02 13:09:15

相關問題