본문 바로가기
백엔드/DB

[PostgreSQL] 중복 데이터 하나만 남기고 삭제하기 delete

by 작은소행성 2022. 4. 8.

중복 데이터 확인

 

셀프 조인을 통해 중복된 행의 id값을 확인하는 방법이다. 

id가 제일 작은 값으로 사용한다. 

근데 아래와 같은 명령어를 사용하면 데이터가 중복되어 좀 더 많이 보이는 현상이 있긴하다. 

 

schemas 에 본인이 사용하는 스키마 이름

tablename 에는 테이블 명을 입력해준다. 

select s1.*
from schemas.tablename s1 join schemas.tablename s2
on s1.title = s2.title and s1.link = s2.link 
where s1.id > s2.id;

 

 

 

중복 데이터 삭제하기

 

sql문으로 데이터 삭제하기에 대해 검색하면 

row_number 를 사용해 partition by로 중복된 컬럼을 지정하고 row_num>1 을 설정해

삭제할 데이터만 가져오는 방법에 대해 많이 나와있다. 

아래와 같은 방법을 사용할 수도 있다. 

명령어를 수행하기 전에 select 문으로 확인해보고 delete문을 사용하길 추천한다. 

-- SELECT * schemas.tablename
DELETE FROM schemas.tablename
WHERE id IN 
(SELECT id
             FROM ( 
                 SELECT id, ROW_NUMBER() OVER (PARTITION BY title, link) as row_num
                 FROM schemas.tablename 
                 ) tmp
             WHERE row_num > 1);

 

 

 

나는 좀 더 짧은 명령어를 사용해 삭제하고 싶었다. 

그래서 아래와 같이 delete 와 using 을 사용했다. 

--select *
--from schemas.tablename s1, schemas.tablename s2
delete from schemas.tablename s1
using schemas.tablename s2
where s1.title = s2.title and s1.link = s2.link and s1.id > s2.id;

 

나는 개인적으로 밑에 방법이 더 좋은것 같다. 

 

 

 

 

추가로 공식 홈페이지에서 delete에 대한 설명을 확인할 수 있다.

 

https://www.postgresql.org/docs/current/sql-delete.html

 

DELETE

DELETE DELETE — delete rows of a table Synopsis [ WITH [ RECURSIVE ] with_query [, ...] ] DELETE FROM …

www.postgresql.org

 

반응형