varchar 열이있는 테이블이 있으며이 열에 중복 값이있는 모든 레코드를 찾고 싶습니다. 중복을 찾기 위해 사용할 수있는 가장 좋은 쿼리는 무엇입니까?
답변
를 수행 SELECT
로모그래퍼 GROUP BY
절. name 이 중복을 찾으려는 열 이라고 가정 해 봅시다 .
SELECT name, COUNT(*) c FROM table GROUP BY name HAVING c > 1;
첫 번째 열에 이름 값 이있는 결과와 두 번째 값에 해당 값이 몇 번 나타나는지를 반환합니다 .
답변
SELECT varchar_col
FROM table
GROUP BY varchar_col
HAVING COUNT(*) > 1;
답변
SELECT *
FROM mytable mto
WHERE EXISTS
(
SELECT 1
FROM mytable mti
WHERE mti.varchar_column = mto.varchar_column
LIMIT 1, 1
)
이 쿼리는 distinct뿐만 아니라 완전한 레코드를 반환합니다 varchar_column
.
이 검색어는을 사용하지 않습니다 COUNT(*)
. 중복이 많고 COUNT(*)
비싸고 전체가 필요하지 않은 COUNT(*)
경우 동일한 값을 가진 두 개의 행이 있는지 알아야합니다.
varchar_column
물론 인덱스를 사용 하면이 쿼리 속도가 크게 향상됩니다.
답변
GROUP_CONCAT
서버가 지원 하는 경우 중복 행의 ID를 얻기 위해 levik의 답변을 토대로 쉼표로 구분 된 ID 목록을 반환합니다.
SELECT GROUP_CONCAT(id), name, COUNT(*) c FROM documents GROUP BY name HAVING c > 1;
답변
테이블 이름이 TableABC이고 원하는 열이 Col이고 T1의 기본 키가 Key라고 가정합니다.
SELECT a.Key, b.Key, a.Col
FROM TableABC a, TableABC b
WHERE a.Col = b.Col
AND a.Key <> b.Key
위의 답변에 비해이 방법의 장점은 키를 제공한다는 것입니다.
답변
SELECT *
FROM `dps`
WHERE pid IN (SELECT pid FROM `dps` GROUP BY pid HAVING COUNT(pid)>1)
답변
Employee의 이름 열에 중복 된 레코드 수를 찾으려면 아래 쿼리가 도움이됩니다.
Select name from employee group by name having count(*)>1;