處理表重複記錄(查詢和刪除)

iSQlServer發表於2009-10-19

宣告:下面的所有SQL語句都來自CSDN的帖子處理表重複記錄(查詢和刪除)裡,然後自己在整理出來的

處理表重複記錄(查詢和刪除)
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt 1 --處理表重複記錄(查詢和刪除)
 2 /******************************************************************************************************************************************************
 3 1、Num、Name相同的重複值記錄,沒有大小關係只保留一條
 4 2、Name相同,ID有大小關係時,保留大或小其中一個記錄
 5 ******************************************************************************************************************************************************/
 6 
 7 --1、用於查詢重複處理記錄(如果列沒有大小關係時2000用生成自增列和臨時表處理,SQL2005用row_number函式處理)
 8 
 9 --> --&gt (Roy)生成測試資料
10  
11 if not object_id('Tempdb..#T'is null
12     drop table #T
13 Go
14 Create table #T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))
15 Insert #T
16 select 1,N'A',N'A1' union all
17 select 2,N'A',N'A2' union all
18 select 3,N'A',N'A3' union all
19 select 4,N'B',N'B1' union all
20 select 5,N'B',N'B2'
21 Go
22 
23 
24 --I、Name相同ID最小的記錄(推薦用1,2,3),方法3在SQl05時,效率高於1、2
25 --方法1:
26 Select * from #T a where not exists(select 1 from #T where Name=a.Name and ID<a.ID)
27 
28 --方法2:
29 select a.* from #T a join (select min(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID
30 
31 --方法3:
32 select * from #T a where ID=(select max(ID) from #T where Name=a.Name)
33 
34 --方法4(注:ID為唯一時可用):
35 select * from #T a where ID in(select min(ID) from #T group by Name)
36 
37 --SQL2005:
38 
39 --方法5:
40 select ID,Name,Memo from (select *,min(ID)over(partition by Name) as MinID from #T a)T where ID=MinID
41 
42 --方法6:
43 
44 select ID,Name,Memo from (select *,row_number()over(partition by Name order by ID) as MinID from #T a)T where MinID=1
45 
46 --生成結果:
47 /*
48 ID          Name Memo
49 ----------- ---- ----
50 1           A    A1
51 4           B    B1
52 
53 (2 行受影響)
54 */
55 
56 
57 --II、Name相同ID最大的記錄,與min相反:
58 --以上面的min相反,只要將min改為max,小號改為大於號即可
59 
60 --2、刪除重複記錄有大小關係時,保留大或小其中一個記錄
61 
62 
63 --I、Name相同ID最小的記錄(推薦用1,2,3),保留最小一條
64 --在上面的基礎上,將select 改為delete即可,
65 --例如方法1 改 為;
66 delete a from #T a where  exists(select 1 from #T where Name=a.Name and ID<a.ID)
67 
68 
69 --3、刪除重複記錄沒有大小關係時,處理重複值
70 方法1:
71 if object_id('Tempdb..#'is not null
72     drop table #
73 Select distinct * into # from #T--排除重複記錄結果集生成臨時表#
74 
75 truncate table #T--清空表


 通過上面這些語句,在日常中即可以很容易處理表重複的問題。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-616843/,如需轉載,請註明出處,否則將追究法律責任。

相關文章