집 >데이터 베이스 >MySQL 튜토리얼 >고유 열을 유지하면서 PostgreSQL 테이블에서 중복 행을 삭제하는 방법은 무엇입니까?
고유 열이 있는 작은 테이블에서 중복 행 제거
PostgreSQL 데이터베이스에서 중복 행을 제거하면 데이터 무결성이 향상되고 성능이 최적화될 수 있습니다. 특히 "키"라는 특정 열에 제한되지 않은 행과 중복 데이터가 포함된 테이블이 있다고 가정해 보겠습니다. 목표는 중복을 제거하고 각각의 고유한 "키" 값의 단일 인스턴스를 유지하는 것입니다.
단일 SQL 명령 솔루션
단일 SQL 명령으로 이 작업을 수행하려면 다음 단계를 사용할 수 있습니다.
1. 처음으로 반복되는 항목을 식별합니다. 먼저, 반복되는 각 행의 첫 번째 발생을 식별해야 합니다. 이 정보는 데이터의 단일 복사본을 유지하는 데 중요합니다.
<code class="language-sql">SELECT MIN(ctid) AS ctid, key FROM dups GROUP BY key HAVING COUNT(*) > 1;</code>
2. 첫 번째 항목이 아닌 항목 삭제: 첫 번째 항목이 식별되면 "ctid" 값을 기준으로 모든 후속 중복 항목을 제거할 수 있습니다. "ctid" 열은 테이블에서 행의 물리적 위치를 나타냅니다.
<code class="language-sql">DELETE FROM dups a USING ( SELECT MIN(ctid) AS ctid, key FROM dups GROUP BY key HAVING COUNT(*) > 1 ) b WHERE a.key = b.key AND a.ctid <> b.ctid;</code>
라인 순서 고려
이 방법은 중복 항목을 효과적으로 제거하지만 여러 항목이 발생하는 경우 어떤 행이 유지되는지 보장하지 않습니다. 유지할 행을 선택하기 위한 특정 기준이 있는 경우 이를 쿼리에 통합해야 합니다.
예:
더 나은 이해를 위해 다음 예를 살펴보세요.
<code class="language-sql">CREATE TABLE people ( name VARCHAR(50) NOT NULL, surname VARCHAR(50) NOT NULL, age INTEGER NOT NULL ); INSERT INTO people (name, surname, age) VALUES ('A.', 'Tom', 30), ('A.', 'Tom', 10), ('B.', 'Tom', 20), ('B', 'Chris', 20); -- 显示重复项的第一次出现: SELECT MIN(ctid) AS ctid, name, surname FROM people GROUP BY (name, surname) HAVING COUNT(*) > 1; -- 删除重复项的非第一次出现: DELETE FROM people a USING ( SELECT MIN(ctid) AS ctid, name, surname FROM people GROUP BY (name, surname) HAVING COUNT(*) > 1 ) b WHERE a.name = b.name AND a.surname = b.surname AND a.ctid <> b.ctid; SELECT * FROM people;</code>
이 예시 테이블에는 잠재적으로 중복되는 개인 데이터가 포함되어 있습니다. 두 번째 쿼리를 실행하면 중복 항목이 제거되고 고유한 이름과 성만 테이블에 남습니다.
위 내용은 고유 열을 유지하면서 PostgreSQL 테이블에서 중복 행을 삭제하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!