Programming

MySQL에서 하나를 제외한 모든 중복 행을 삭제 하시겠습니까?

procodes 2020. 2. 21. 22:34
반응형

MySQL에서 하나를 제외한 모든 중복 행을 삭제 하시겠습니까? [복제]


가능한 중복 :
MySQL에서 중복 행 제거

MySQL 테이블에서 모든 중복 데이터를 어떻게 삭제합니까?

예를 들어 다음과 같은 데이터가 있습니다.

SELECT * FROM names;

+----+--------+
| id | name   |
+----+--------+
| 1  | google |
| 2  | yahoo  |
| 3  | msn    |
| 4  | google |
| 5  | google |
| 6  | yahoo  |
+----+--------+

쿼리 인 SELECT DISTINCT name FROM names;경우 사용 SELECT합니다.

어떻게이 함께 할 것입니다 DELETE만 제거 중복에 각각의 하나 개의 기록을 유지?


편집기 경고 :이 솔루션은 계산이 비효율적이며 큰 테이블에 대한 연결이 끊어 질 수 있습니다.

NB - 당신은 필요 에 처음이 작업을 수행하는 테스트 사본 테이블의!

내가 그것을했을 때 나는 또한 포함하지 않으면 AND n1.id <> n2.id테이블의 모든 행을 삭제 한다는 것을 알았 습니다.

  1. 가장 낮은 id값으로 행을 유지하려면 다음을 수행하십시오 .

    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
    
  2. 행을 가장 높은 id으로 유지하려면 다음을 수행하십시오 .

    DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
    

MySQL 5.1 에서이 방법을 사용했습니다.

다른 버전에 대해서는 확실하지 않습니다.


업데이트 : 중복 제거를위한 인터넷 검색 사람들이 여기에 있기 때문에
OP의 질문에 관한 것이지만 DELETE사용 INSERT하고 DISTINCT훨씬 빠릅니다. 행이 8 백만인 데이터베이스의 경우 아래 쿼리에 13 분이 걸렸지 만을 (를) 사용 DELETE하는 데 2 ​​시간 이상 걸리지 만 아직 완료되지 않았습니다.

INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
    SELECT DISTINCT cellId,attributeId,entityRowId,value
    FROM tableName;

가장 낮은 id값으로 행을 유지하려면 다음을 수행하십시오 .

DELETE FROM NAMES
 WHERE id NOT IN (SELECT * 
                    FROM (SELECT MIN(n.id)
                            FROM NAMES n
                        GROUP BY n.name) x)

id가장 높은 값을 원하는 경우 :

DELETE FROM NAMES
 WHERE id NOT IN (SELECT * 
                    FROM (SELECT MAX(n.id)
                            FROM NAMES n
                        GROUP BY n.name) x)

하위 쿼리의 하위 쿼리는 MySQL에 필요하거나 1093 오류가 발생합니다.

참고 URL : https://stackoverflow.com/questions/4685173/delete-all-duplicate-rows-except-for-one-in-mysql



반응형