이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 14609|회답: 0

[팁] SQL 중복 제거를 위해 테이블을 쿼리하는 방법

[링크 복사]
게시됨 2014. 10. 9. 오전 11:03:04 | | |

SQL 싱글/멀티 테이블 쿼리는 중복 레코드를 제거합니다

단일 테이블 구분

  1. select distinct 字段 from 表
코드 복사

많은 투표가 그룹화되어 있습니다

그룹 by를 주문 및 제한 전에 입력해야 하며, 그렇지 않으면 오류가 보고됩니다

************************************************************************************

1. 테이블에서 중복된 중복 레코드를 찾고, 중복 레코드는 단일 필드(peopleId)를 기준으로 판단됩니다.

사람들로부터 * 선택
여기서 peopleId는 (count(peopleId) > 1을 가진 사람들 그룹별로 PeopleId를 선택함)

2. 테이블에서 중복된 중복 레코드를 삭제하면, 중복 레코드는 단일 필드(peopleId)를 기준으로 판단되어 가장 작은 로이드를 가진 레코드만 남게 됩니다
사람들로부터 삭제
여기서 peopleId는 (count(peopleId) > 1을 가진 사람들 그룹별로 PeopleId를 선택함)
그리고 rowid가 없다 (peopleId에 의해 Count(peopleId)>1)

3. 테이블에서 중복된 중복 레코드(여러 필드) 찾기
이력서 A에서 * 선택
여기서 (a.peopleId, a.seq) 내에서 (vitae 그룹에서 peopleId, seq를 선택하여 count(*) > 1)

4. 테이블에서 중복된 중복 레코드(여러 필드)를 삭제하고, 가장 작은 로이드를 가진 레코드만 남깁니다
Vitae A에서 삭제하기
여기서 (a.peopleId, a.seq) 내에서 (vitae 그룹에서 peopleId, seq를 선택하여 count(*) > 1)
그리고 rowid가 포함되지 않음 (vitae 그룹에서 min(rowid) in peopleId, seq가 count(*)>1)


5. 테이블에서 중복된 중복 레코드(여러 필드)를 찾고, 가장 낮은 rowid를 가진 레코드를 포함하지 않는 경우를 찾는다.
이력서 A에서 * 선택
여기서 (a.peopleId, a.seq) 내에서 (vitae 그룹에서 peopleId, seq를 선택하여 count(*) > 1)
그리고 rowid가 포함되지 않음 (vitae 그룹에서 min(rowid) in peopleId, seq가 count(*)>1)

(2)
예를 들어
표 A에는 "name" 필드가 있습니다.
그리고 "이름" 값은 서로 다른 레코드 간에 같을 수 있습니다.
이제 테이블 내 레코드 간에 중복된 "name" 값이 있는 항목을 쿼리해야 합니다;
이름별로 count(*) > 1을 가진 그룹에서 이름, count(*)를 선택합니다

성별도 동일하다면, 다음과 같습니다:
이름, 성별, 백수(*) 중에서 이름, 성별, 백수(*) > 1

(셋)
방법 1

정수를 @max 선언하라, @id 정수

메인 필드를 선택cur_rows 커서를 로컬 선언하고, 메인 필드별로 테이블 이름 그룹에서 count(*) >을 가지며; 1

오픈 cur_rows

@id로 데려cur_rows @max

@@fetch_status=0

시작

선택 @max = @max -1

행 수 @max

기본 필드 = @id 테이블 이름에서 삭제

@id로 데려cur_rows @max

가cur_rows

열 수 0을 설정하세요

방법 2

"중복 레코드"는 중복 레코드에 대해 두 가지 의미가 있는데, 하나는 완전히 중복된 레코드로, 모든 필드가 중복된 레코드이고, 다른 하나는 핵심 필드의 중복 부분이 포함된 레코드로, 예를 들어 이름 필드가 중복된 경우입니다. 반면 다른 필드는 반드시 중복되지 않거나 무시할 수 있습니다.

1. 첫 번째 반복 유형은 비교적 쉽게 풀고 사용할 수 있습니다

tableName에서 distinct * 선택하세요

중복 기록이 없는 결과 세트를 얻을 수 있습니다.

중복 레코드를 삭제해야 한다면(중복 기록 1개만 남기세요), 다음과 같이 삭제할 수 있습니다

tableName에서 distinct * 를 #Tmp로 선택합니다

테이블 테이블 제거 테이블이름(drop table name)

테이블 이름에서 *를 선택#Tmp
드롭 테이블 #Tmp

이 중복은 부실한 테이블 설계 때문에 발생하며, 고유한 인덱스 열을 추가함으로써 해결할 수 있습니다.

2. 이러한 유형의 중복 문제는 보통 중복 기록의 첫 번째 레코드를 유지해야 하며, 연산 방법은 다음과 같습니다

예를 들어 Name과 Address라는 중복된 필드가 있고, 이 두 필드에 대해 고유한 결과 집합을 가져야 한다고 가정해 봅시다

tableName에서 identity(int,1,1)를 autoID로 선택하고, * #Tmp

이름, autoID로 그룹에서 #Tmp2 #Tmp 그룹에서 min(autoID)을 autoID로 선택하세요

자동 식별이 있는 #Tmp에서 * 선택(#tmp2에서 자동 식별 선택)

마지막 선택은 반복되지 않는 Name과 Address 결과 집합을 얻지만(실제 작성 시 select 절에 추가할 수 있는 추가 autoID 필드가 있습니다)

(4)
쿼리가 중복됩니다

테이블 이름에서 * 선택, ID in (테이블 이름에서 ID 선택

ID별 그룹

1> count(id)

)

3. 테이블에서 중복된 중복 레코드(여러 필드) 찾기
이력서 A에서 * 선택
여기서 (a.peopleId, a.seq) 내에서 (vitae 그룹에서 peopleId, seq를 선택하여 count(*) > 1)

실행하면 문제가 생기고, where(a.peopleId, a.seq) 같은 방식으로 쓰고 보내면 작동하지 않습니다!!






이전의:SQL은 매개변수를 가진 저장 프로시저를 생성합니다
다음:EPUBReader 리더, EPUB 파일 열 때 꼭 필요한 자료
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com