백엔드/DB

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

작은소행성 2022. 4. 8. 16:17

중복 데이터 확인

 

셀프 조인을 통해 중복된 행의 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

 

반응형