航空论坛_航空翻译_民航英语翻译_飞行翻译

 找回密码
 注册
搜索
查看: 1318|回复: 0
打印 上一主题 下一主题

SQL Server中删除重复数据的几个方法 [复制链接]

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-11 23:36:48 |只看该作者 |正序浏览
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
3 j9 d3 d2 }; \) `4 @* b  m  T
! m* d3 d! X5 b; s' D方法一
5 C6 H/ ^6 S; _( G! h1 M: J4 L& X/ X6 s
declare @max integer,@id integer
2 H! ^. y  m/ l2 {declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 17 V5 v0 e# W  t* O, e, }2 i' F2 I
open cur_rows
* L8 C* i  L, hfetch cur_rows into @id,@max
) e6 m* P1 O9 F/ Q% ?) y2 p: awhile @@fetch_status=0
8 l+ J5 }0 t1 `begin
, y! t1 a- o( s& Wselect @max = @max -1
$ w/ \+ j6 q$ L& lset rowcount @max
1 R0 R; b2 J* B' }/ hdelete from 表名 where 主字段 = @id
9 c4 G: W6 s$ Qfetch cur_rows into @id,@max2 k  g& K# c1 p
end  q" r0 Y8 q! q1 e, I. ~
close cur_rows
2 `4 v% e& H5 x+ fset rowcount 0, u! d2 y4 \0 W! f9 b- K* h
- q) P- N$ `  P2 A& z- A

8 W" \8 b1 R0 d3 h$ E0 c+ m方法二
  M9 L$ j& C0 J9 _1 x7 \4 K! s( w( n& [4 p# a
  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
$ T) g; P* T3 |
5 n7 W4 c, H' y6 E2 L4 e  1、对于第一种重复,比较容易解决,使用
' q- M% F1 i/ Z( s
4 p& l) J8 m$ K3 e# N. N7 Q' eselect distinct * from tableName# V: ^1 H) c- ~/ I8 ]
6 `% w; K, k3 W

8 X* \' C/ @0 ]. b  就可以得到无重复记录的结果集。
0 ~, Z1 ]' N3 j( c6 c. f4 n. t) @3 D8 Y9 _) n- q
  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
) w! m$ K* Y% f# ?
% ^6 c$ Y2 Q+ f% I) bselect distinct * into #Tmp from tableName
" B* M1 {7 u; x' Idrop table tableName8 u2 E3 g( q3 n" C8 ~
select * into tableName from #Tmp/ Q  g; s, I1 k$ }/ t6 h  Y
drop table #Tmp ( \$ |& U/ ~8 H' C- F+ W5 k

0 x7 {$ ?, b. T& F$ w0 q/ `6 v+ W6 c: T3 `! M& f+ R
  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
5 V' Z* t  p0 ^
3 ~6 h: C9 `+ u5 b; a6 T7 ^( m  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下7 @# M6 q! J0 n1 g( m
6 g; s- K0 I6 b! c, T1 V: m, K( H1 B
  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
- t; c# {0 J& j- ]3 v
( Z5 ]0 _& U5 E( y& D, rselect identity(int,1,1) as autoID, * into #Tmp from tableName/ m2 S( p! R* ^% @( q' x
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
. \1 J; U; S% d% f3 ?- k2 V6 ]select * from #Tmp where autoID in(select autoID from #tmp2) . K. m+ ~1 V$ B& c: ^8 f3 m

6 A. g0 V# F. f% Z* @; H5 O5 H) K# E
  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)! P( e$ z/ f- m+ v

! C: E. C! K  I0 \- |% v  查询分析器不能单步调试的的原因; Z/ W. c* m1 X

+ Z6 M. Y3 @4 J' W" n; l0 n' O7 i  D+ R  具体步骤如下: . P1 \" y. |8 s: \& X+ l6 f# u( R

' s; f  c2 d' }. j  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) ' u' S1 ]  T; p8 }* Q6 g5 a
. l& V3 q1 H4 G
  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
3 H0 z7 o6 a9 a" Y* G& v0 K3 Q; M' A9 X% C  o
  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: 8 Y: g! i7 N2 J0 J. t( C% F) R! B
  a、在【服务器】上运行dcomcnfg.exe; * Z/ u' n" [6 J( j

, O  A* w0 M# u( v' u1 C. T" X0 {  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; 6 r: g6 R3 e& a- _& g

1 f9 ?5 o% n! w: l4 o' D  c、重新启动SQL Server服务;
" x0 f3 U2 q- [8 u/ V& y, v
: Q% W/ M) F! {+ k! h7 D* V/ e  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。
2 P# v/ u) a6 Z( Z; j  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。
您需要登录后才可以回帖 登录 | 注册


Archiver|航空论坛 ( 渝ICP备10008336号 )

GMT+8, 2025-7-16 22:16 , Processed in 0.021001 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部