>php教程 >PHP开发 >SQL은 테이블에서 모든 중복 레코드 데이터를 찾습니다.

SQL은 테이블에서 모든 중복 레코드 데이터를 찾습니다.

高洛峰
高洛峰원래의
2016-11-16 11:00:541514검색

1. 인터뷰 중에 id와 name이라는 두 개의 필드가 있는 테이블을 작성하고 이름이 반복되는 모든 데이터를 쿼리하는 문제가 발생했습니다.

SELECT * from xi a where (a.username) in  (SELECT username from xi group by username  having count(*) > 1)

2. 모든 데이터를 쿼리하고 그룹화한 후 쿼리한 데이터와 중복된 데이터의 반복 횟수는 다음과 같습니다.

SELECT count(username) as '重复次数',username from xi group by username  having count(*)>1 order by username desc

3. 다른 사람의 결과를 보려면 쿼리한 데이터가 아래에 나열됩니다. : 중복 레코드 조회 및 삭제 종합 방법

1. 테이블에서 중복 레코드를 찾습니다. 단일 필드(peopleId)를 기준으로 중복 레코드를 판단합니다.

SELECT * from people
where peopleId in (select  peopleId  from  people  group  by  peopleId  having  count(peopleId) > 1)

2. 테이블의 레코드가 중복됩니다. 단일 필드(peopleId)를 기준으로 판단되며 가장 작은 rowid가 있는 레코드만 남깁니다.

DELETE from people 
where peopleId  in (select  peopleId  from people  group  by  peopleId   having  count(peopleId) > 1)
and rowid not in (select min(rowid) from  people  group by peopleId  having count(peopleId )>1)

또한 MySQL에서 위의 SQL을 사용하면 오류가 보고됩니다. FROM 절에 업데이트할 대상 테이블 'XXX'를 지정할 수 없고, 테이블 수정 중에 동일한 테이블을 쿼리할 수 없으므로, 다음 명령문과 같이 테이블 데이터 수정 조건으로 쿼리 결과를 임시 테이블로 명명할 수 있다. 위의 오류를 방지하려면.

DELETE from user where user_id in(
    (SELECT user_id from 
        (SELECT c.* from cab_user c where c.extra_id in 
            (SELECT  a.extra_id  from user a group  by  a.extra_id having  count(a.extra_id) > 1) and c.user_id not in 
            (SELECT min(b.user_id) from  user b group by b.extra_id having count(b.extra_id )>1)
        ) d
    )
)

3. 테이블에서 중복된 레코드(여러 필드)를 찾습니다.

SELECT * from vitae a
where (a.peopleId,a.seq) in  (SELECT peopleId,seq from vitae group by peopleId,seq  having count(*) > 1)

4. 테이블에서 중복된 레코드(여러 필드)를 삭제하고 다음이 포함된 레코드만 남깁니다. 가장 작은 rowid

delete from vitae a
where (a.peopleId,a.seq) in  (SELECT peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

5. 조회 테이블의 중복된 레코드(여러 필드)는 가장 작은 rowid를 가진 레코드를 포함하지 않습니다

SELECT * from vitae a
where (a.peopleId,a.seq) in  (SELECT peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

(2)
예를 들어
테이블 A에 "name" 필드가 있고
서로 다른 레코드 간의 "name" 값이 동일할 수 있다고 가정해 보겠습니다.
이제 테이블에 있는 레코드 간의 차이점을 쿼리해야 합니다. , "이름" 값에 중복된 항목이 있습니다.

SELECT Name,Count(*) From A Group By Name Having Count(*) > 1

성별도 동일한 경우 결과는 다음과 같습니다.

SELECT Name,sex,Count(*) From A Group By Name,sex Having Count(*) > 1

(3)
방법 1은 @max 정수, @id 정수를 선언하고 cur_rows 커서를 기본 필드 선택에 대해 로컬로 선언하고 테이블 이름에서 count(*)를 갖는 기본 필드별로 그룹화합니다. 1cur_rowsfetch cur_rows를 @id,@maxwhile @@fetch_status= 0beginselect @max = @max -1set rowcount @maxdelete from table name where main field = @idfetch cur_rows into @id,@maxendclose cur_rowsset rowcount 0

방법 2 "중복 레코드"에는 중복 레코드의 두 가지 의미가 있습니다. 완전히 중복된 레코드, 즉 모든 필드가 두 번째로 반복되는 레코드, 이름 필드와 같은 일부 키 필드가 반복되고 다른 필드는 반복되지 않거나 무시될 수 있는 레코드입니다.

1. 첫 번째 유형의 중복은 해결하기가 더 쉽습니다. 테이블에서 중복 레코드를 삭제해야 하는 경우(중복 레코드 1개 유지) 다음과 같이 삭제할 수 있습니다. select Unique * into #Tmp from tableNamedrop table tableNameselect * into tableName from #Tmpdrop table #Tmp 이 중복의 이유는 테이블이 디자인이 올바르지 않습니다. 이는 몇 주 안에 발생하며 고유 인덱스 열을 추가하면 해결될 수 있습니다.

2. 이러한 유형의 중복 문제는 일반적으로 중복 레코드 중 첫 번째 레코드를 유지해야 하며, 작업 방법은 다음과 같습니다. 이름과 주소가 중복되어 고유한 결과를 얻어야 합니다. 이 두 필드 집합은 autoID로 ID(int,1,1)를 선택하고, * into #Tmp from tableNameselect min(autoID)를 autoID로 #Tmp2 from #Tmp group by Name,autoIDselect * from #Tmp where autoID in(autoID 선택 from #tmp2) 마지막 select는 중복되지 않은 이름과 주소를 가진 결과 집합을 얻었습니다(단, 별도의 autoID 필드가 있습니다. 실제로 작성 시 select 절에서 이 열을 생략할 수 있습니다)

(4) 반복 쿼리

SELECT * from tablename where id in (select id from tablenamegroup by idhaving count(id) > 1)


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.