Найти в Дзене
Code Roilen

PostgreSQL - удалить дубликаты из базы

Иногда надо удалить дубликаты из таблицы БД. В PostgreSQL особые правила работы с CTE, поэтому тут есть очень лаконичный и красивый способ: DELETE FROM public.table
WHERE id NOT IN (
SELECT MIN(id) FROM public.table
GROUP BY code, codeinteger 
); Если все-таки хочется удалить через CTE, то вот так: WITH CTE (id, ref_header_id, code, codeinteger, DuplicateCount) AS(
SELECT id, ref_header_id, code, codeinteger,
ROW_NUMBER() OVER(PARTITION BY ref_header_id, code, codeinteger ORDER BY id DESC) AS DuplicateCount FROM public.reference)
DELETE FROM public.reference WHERE id IN (SELECT id FROM cte WHERE DuplicateCount > 1 ORDER BY id DESC); Фишка в том, что у Postgres CTE не редактируемый.

Иногда надо удалить дубликаты из таблицы БД. В PostgreSQL особые правила работы с CTE, поэтому тут есть очень лаконичный и красивый способ:

DELETE FROM public.table
WHERE id NOT IN (
SELECT MIN(id) FROM public.table
GROUP BY code, codeinteger 
);

Если все-таки хочется удалить через CTE, то вот так:

WITH CTE (id, ref_header_id, code, codeinteger, DuplicateCount) AS(
SELECT id, ref_header_id, code, codeinteger,
ROW_NUMBER() OVER(PARTITION BY ref_header_id, code, codeinteger ORDER BY id DESC) AS DuplicateCount FROM public.reference)
DELETE FROM public.reference WHERE id IN (SELECT id FROM cte WHERE DuplicateCount > 1 ORDER BY id DESC);

Фишка в том, что у Postgres CTE не редактируемый.