데이터베이스 에서 중복 되 는 데 이 터 를 삭제 하 는 몇 가지 방법

방법 선언 @max integer,@id integer declare cur_rows cursor local for select 주 필드,count(*) from 시계 group by 주 필드 having count(*) > 1 open cur_rows fetch cur_rows into @id,@max while @@fetch_status=0 begin select @max = @max -1 set rowcount @max delete from 시계 where 주 필드 = @id fetch cur_rows into @id,@max end close cur_rows set rowcount 0 방법 2 는 두 가지 의미 의 중복 기록 이 있 습 니 다.하 나 는 완전히 중복 되 는 기록 입 니 다.즉,모든 필드 가 중복 되 는 기록 입 니 다.다른 하 나 는 일부 관건 적 인 필드 가 중복 되 는 기록 입 니 다.예 를 들 어 Name 필드 가 중복 되 고 다른 필드 가 반드시 중복 되 거나 중복 되 지 않 으 면 무시 할 수 있 습 니 다.1.첫 번 째 중복 에 대해 비교적 쉽게 해결 하고 사용 select distinct * from tableName 중복 기록 이 없 는 결과 집 을 얻 을 수 있 습 니 다.이 표 가 중 복 된 기록 을 삭제 해 야 한다 면 다음 과 같은 방법 으로 select 를 삭제 할 수 있 습 니 다. distinct * into #Tmp from tableName drop table tableName select * into tableName from #Tmp drop table #Tmp 에서 이러한 중복 이 발생 하 는 이 유 는 표 디자인 이 주도면밀 하지 않 아서 발생 한 것 으로 유일한 색인 열 을 추가 하면 해결 할 수 있다.2.이러한 중복 문 제 는 보통 중복 기록 의 첫 번 째 기록 을 보존 해 야 합 니 다.조작 방법 은 다음 과 같 습 니 다.중복 되 는 필드 가 Name,Address 라 고 가정 하면 이 두 필드 의 유일한 결과 집합 select 를 받 아야 합 니 다. identity(int,1,1) as autoID, * into #Tmp from tableName select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID select * from #Tmp where autoID in(select autoID from #tmp 2)마지막 select 는 Name,Address 가 중복 되 지 않 는 결과 집합 을 얻 었 습 니 다.(그러나 autoID 필드 가 하나 더 생 겼 습 니 다.실제 쓸 때 selection 자구 에 이 열 을 줄 일 수 있 습 니 다)

좋은 웹페이지 즐겨찾기