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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-11 23:36:48 |只看该作者 |倒序浏览
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
) N8 b! _8 G) ?' Z# |" s
9 c! p/ B9 ~; H, e3 z; E0 J方法一
9 d- F6 D9 Z% Y9 g9 y; m5 h) A4 F) {& h, u7 [$ V; S! `* V
declare @max integer,@id integer
( w4 i9 D: r% Z6 R3 b- qdeclare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 17 v8 n( D/ {! M( ^
open cur_rows
" B. |7 V+ i- f6 D8 g  d9 a: Z7 `fetch cur_rows into @id,@max; U+ W5 t0 L" ^
while @@fetch_status=02 \: O" `3 p: U
begin% @, Y% V! w+ V% `5 \2 s
select @max = @max -1
6 A0 E) t! ]9 b# jset rowcount @max# F( a$ C( B2 b/ S6 Z' l$ z
delete from 表名 where 主字段 = @id
: b2 a2 r& J8 ~+ Ifetch cur_rows into @id,@max
% p  |, o3 _. y' Qend% y$ \6 Y9 Y; a# c$ O% }
close cur_rows3 ]8 ~7 S& R! X9 W! F
set rowcount 00 y, l2 J. E+ j# S, _+ Z' |- ]
1 i! ^; T: s: O2 S/ C$ D

9 t4 l  R+ M* F7 D6 [9 M方法二9 x; M. L% a& P6 q8 @' @. ^
4 C- h" p4 B2 T- i: b. J$ C) g% T
  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。1 Y& z4 _" e% c3 G, J' z; ^7 h

: n" u* y3 Z  u$ v! s  1、对于第一种重复,比较容易解决,使用
' z$ A5 \- u8 f3 B& H4 R' t& _1 |; M" S
select distinct * from tableName
) O' M- [. O9 H! w% e5 W0 N) x0 I! e
8 z; L& K# G# @: Z
  就可以得到无重复记录的结果集。. z8 r0 \8 n- Q- K4 {) j

# h% F" I: u8 S. o  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
: k' t# Q- _! `# [8 b
5 r( G" M( q& bselect distinct * into #Tmp from tableName$ C4 E% V4 a* j
drop table tableName2 r! }) _. H* h0 R  F2 L" n; F
select * into tableName from #Tmp
9 O4 ]' t8 \3 p9 @0 p. tdrop table #Tmp 7 l( i2 o$ }7 ^7 \7 ~8 k

% g5 @- q" a! Z. U3 v4 h
. ?" g+ u6 W2 R" B$ F: t  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。7 _5 ^$ U! L9 r0 Y- {0 A
8 _) {3 S4 ?6 b( z
  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下% a4 ]2 _( \. e, V# p4 }6 s
( T5 Y: U! E5 l' M- P% P
  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集
8 A5 ~6 }5 }" o1 M% ^" u6 }9 P* w" ~
select identity(int,1,1) as autoID, * into #Tmp from tableName  ~0 N2 K# K* r1 m8 W
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID5 h  c) u3 p0 J& [6 c% e
select * from #Tmp where autoID in(select autoID from #tmp2)
0 |) t$ t$ o; X- Z6 h
* q% o* q* t7 W  ^" j  y2 I  U; g  F5 I
  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)! c1 y$ Z, g# l2 d
: _2 t6 O3 k$ i
  查询分析器不能单步调试的的原因
/ P- ^' N! S7 }3 j2 y. B7 v5 X# }) s6 T( w: C
  具体步骤如下:
. U- W2 ~3 B7 R. S: [9 @5 X" E* Z. F3 o8 F- V" R$ n, D
  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证) 1 @. B1 U7 i- A4 u5 l& |

# Y, i% U- k9 H% a( ?  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
" E% P& ]& s+ R( m/ F! H$ k. `' B
  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: & v( p, F& r# q" C4 i
  a、在【服务器】上运行dcomcnfg.exe; ; ?  R( J3 p% f& D' N
# d# J' J! s: `( p* L
  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组; 5 o+ S8 Y4 l: ?- _/ R( D& L

# Y- w3 s) S5 d  c、重新启动SQL Server服务;
3 G2 F' [" J  _5 f& ^" ^4 e
& P# N1 ?' t9 t  a/ W+ q9 E- L  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。 * A- v5 B" h/ v' ]5 ~8 J1 [
  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2026-2-3 22:32 , Processed in 0.021001 second(s), 10 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部