Как удалить дубликаты данных из таблицы postgres, если только один или два столбца имеют дубликаты? - PullRequest
0 голосов
/ 25 марта 2019

У меня есть таблица с дублирующимися данными в одном или двух столбцах.Я хочу удалить дубликаты данных и сохранить только одну запись.

Я попробовал следующий код, но он удалил все данные из моей таблицы.

DELETE from test del 
WHERE EXISTS (
        SELECT *
        FROM test ex
        WHERE ex.name= del.name      
        );

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Если первичного ключа нет, хитрость для распознавания повторяющихся строк заключается в использовании ctid, псевдостолбца, который определяет (недолговечное) физическое расположение строки.Две строки не могут иметь одинаковые ctid, и ctid можно сравнивать друг с другом.

В следующем запросе добавлено условие, позволяющее различать удаляемые строки по отношению к той, которую нужно сохранить, для каждого дубликата.

DELETE from test del 
WHERE EXISTS (
        SELECT *
        FROM test ex
        WHERE ex.name= del.name
          AND ex.ctid > del.ctid
        );
0 голосов
/ 25 марта 2019

Если ваши данные имеют первичный ключ, то вы можете сделать:

delete from test t
    where t.pk in (select min(t2.pk) from test t2 group by t2.name);
...