2013-07-02 167 views
4

我已經研究了它,而我發現的最實用的方法是創建一個過程。程序
添加一個id,刪除重複的行,並最終將一個id列添加到新形成的表。我想知道,必須有一個更簡單的方法。下面的代碼,它的工作原理...如何刪除重複(重複)記錄,從表中沒有編號的行

- 我的表

create table dublicateTable 
(
name varchar(30) 
) 

--duplicatedly插入的行

insert into dublicateTable values('Kerem') 
insert into dublicateTable values('Taner') 
insert into dublicateTable values('Mehmet') 
insert into dublicateTable values('Serhat') 

--first情況

select * from dublicateTable 


name 
----- 
Kerem 
Kerem 
Kerem 
Taner 
Taner 
Mehmet 
Mehmet 
Mehmet 
Mehmet 
Serhat 
Serhat 
Serhat 

--dynamicaly形成sql代碼程序

USE [myDataBase] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
create procedure [dbo].[usp_delete_duplicate] 
as 
declare 
@add_id_text nvarchar(50), 
@delete_id_text nvarchar(50), 
@command_text nvarchar(100) 
begin 
set @add_id_text='alter table dbo.dublicateTable add id int identity(1,1)' 
set @command_text='delete from dbo.dublicateTable where id not in(select min(id) from dbo.dublicateTable group by name)' 
set @delete_id_text='alter table dbo.dublicateTable drop column id' 
exec sp_executesql @add_id_text 
exec sp_executesql @command_text 
exec sp_executesql @delete_id_text 
exec sp_executesql @add_id_text 
end 

--final situation.it工程..

exec usp_delete_duplicate 


select id,name from dublicateTable 


id  name 
---  ---- 
1  Kerem 
2  Taner 
3  Mehmet 
4  Serhat 
+0

是的但不同的觀點 –

回答

3

的CTE可以讓它看上去更容易編寫。

;with cte as (
    select 
     name, 
     row_number() over (partition by name order by name) row 
    from 
     dublicateTable 
) 
delete from cte where row > 1 
+0

thanks.it作品完美。 –

+0

不需要在cte中包含'name'字段,因爲它不直接用於查詢。 – Anon