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

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

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

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
1#
发表于 2009-11-11 23:36:48 |只看该作者 |倒序浏览
数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置…… & c- y6 y% Q8 r( Y5 R7 T

# K; w8 f3 {* B3 E2 h, E方法一
9 f6 S" z8 W$ s- }1 c- e; n1 S
8 |# P4 m. t; g0 A9 l! p, F: Wdeclare @max integer,@id integer4 r2 ^6 D+ l/ ]0 f7 \4 w; P7 X8 [
declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 18 c1 _% h7 _' p& }/ K: r+ q
open cur_rows/ H% P& @0 X2 }: C: b
fetch cur_rows into @id,@max
+ T' e# D6 @6 z+ O) [( swhile @@fetch_status=0+ s# S" ]. Z4 z+ [
begin* R; r& }8 |! l3 {1 b
select @max = @max -1
( V5 O) P, f# h. A4 fset rowcount @max
, l& A; Q; T% v& Z+ m  q5 jdelete from 表名 where 主字段 = @id8 A+ F+ ]/ A- e7 e
fetch cur_rows into @id,@max
! X1 M( x$ O5 i5 Send
1 M- t! Q, G- S$ l0 d8 oclose cur_rows
/ U3 O$ a; b2 S+ s( ]8 y$ G; mset rowcount 0
. z; m1 r4 t& n) ?$ F$ R+ K$ w. q9 c; }+ B+ A( M

7 ?9 i1 o  k) t! M" Z9 N- P" I方法二" Q, Y; u/ s/ ?
. o) }; a, M4 J, b5 M, j) }
  有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
' I1 E( A0 Y9 [6 j
! D- t& S* c1 B  w5 T3 e, L0 j/ I  1、对于第一种重复,比较容易解决,使用
) `1 ?7 x+ Y; n" o% {! V0 j/ ~2 V& _. n/ ]2 u& k0 x( a, S
select distinct * from tableName% [. s2 j' ~% Q9 B) E3 o2 D
  D; Z& B* C) Q/ ]2 K

$ O( }- z$ f$ T  就可以得到无重复记录的结果集。/ x1 e! N& c- s+ `6 l/ m1 P
; d( G) l' E" L5 ~  h4 |6 W; ?$ l/ ]
  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除6 N% H# O* @( M2 T

% w% O# \( H0 w; @* W( w7 t  D+ qselect distinct * into #Tmp from tableName9 O& P  D: @% z+ i6 G
drop table tableName
/ F8 f& Y8 x" @2 Wselect * into tableName from #Tmp
$ M* s: p" P2 w( E- |0 xdrop table #Tmp 4 {* W+ Z; ?& j$ D3 K
  k) P! L' j1 F
( f* |: c0 K1 x4 X* y/ ^; i
  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
% \0 v9 @: s! l! h8 X5 Y
9 ?+ ^8 R9 v1 z& b  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下
  s; C( b9 V$ N3 p0 T
# m2 a1 a: n& s# [+ N2 b# H  假设有重复的字段为Name,Address,要求得到这两个字段唯一的结果集' b, p( X5 F# u" J6 [% N$ N
3 M4 b# U5 g( R
select identity(int,1,1) as autoID, * into #Tmp from tableName$ `: J/ P4 V  \9 |9 t; d& r
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID9 C- \7 P# ?! _/ Q
select * from #Tmp where autoID in(select autoID from #tmp2) 9 f% l2 j$ W- n$ w2 k

' J: A1 _; r, ]& W  K  `8 t
3 _& L! ]% E/ ~+ S% w& t  最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列): y. _& W: Y( \* ~! s
8 l( W1 p& W( A2 f7 h* _( P
  查询分析器不能单步调试的的原因
  |# r7 H) o0 C  x$ E  f( ]- X
  \" o: n. E( j) Y4 ^  具体步骤如下:
: ]0 z& n7 a) H: G
2 M  d& U* O% X( i' C& X; H  1、将服务器【身份验证】属性设置成【混合模式】(window与SQL身份验证)
+ u; C$ [; o% N) m8 x0 [: E; h: z& a
/ }) B% a& t0 J; P* Z9 f; Q# z  2、在【控制面板】中打开【服务】将【MS SQL Server】服务打开【属性】,选择【登录】页面,将登录身份设置成服务器本地帐号和该帐号密码,如administrator,密码123;
9 N4 F9 w" z3 J
8 q& {" @" Y, Y* p% `2 ^( E9 v  3、重新启动SQL Server服务,此时的服务指的是【SQL服务管理器】中的SQL Server服务;假设【帐号】设置为administrator 。此时达到的效果是:服务器本地帐号administrator与客户端上的administrator(并且该帐号的密码要与服务器密码相同)可以通过【查询分析器】进行调试;如果想让【其他帐号】也能够调试,那么还需要如下设置: 0 r( K) I$ R# b' u9 Y% l
  a、在【服务器】上运行dcomcnfg.exe;
4 ]/ T% Q( ]8 N" J! }  k( m+ ^) x0 s# c
  b、在【默认安全机制】中【默认访问权限】右边点击【编辑默认值】选择允许调试的帐号类型,如users用户类型,sample帐号有包含users组;
6 ^6 G3 k4 R! {% o- D" g( A: I. D2 y
1 A1 w7 ~, L* @; k4 y) M  c、重新启动SQL Server服务; & f8 |  O( r8 g+ {3 E1 C" ]9 b2 }

$ o. L6 b! c2 C2 S  3、在客户端上创建与服务帐号密码一样的用户,如sample;做到这步就可以通过查询分析器的调试功能进行单步调试了。 " A+ j* |) I; h. |# F4 `9 u
  注:第二步更改“启动服务帐户”,在第一次登录之前,必须更改用户密码。不然,event log:以当前密码登录的尝试因下列错误而宣告失败: 在第一次登录之前,必须更改用户密码。
您需要登录后才可以回帖 登录 | 注册


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

GMT+8, 2025-5-25 10:59 , Processed in 0.015601 second(s), 9 queries .

Powered by Discuz! X2

© 2001-2011 MinHang.CC.

回顶部