Удалить повторяющиеся строки из таблицы - PullRequest
2 голосов
/ 07 мая 2011

У меня есть уникальные ключи id ключи в моей таблице, но у меня есть столбец с повторяющимися значениями? как мне избавиться от них, сохранив только один из них, например:

Дубликаты записей:

id  | name   | surname |
1   | test   | one     |
2   | test   | two     |
3   | test3  | three   |
4   | test7  | four    |
5   | test   | five    |
6   | test11 | eleven  |

Без дубликатов:

id  | name   | surname |
1   | test   | one     |
3   | test3  | three   |
4   | test7  | four    |
6   | test11 | eleven  |

Я гуглил это, но, похоже, не работает:

DELETE  ct1
FROM    mytable ct1
        , mytable ct2
WHERE   ct1.name = ct2.name 
        AND ct1.id < ct2.id 

ERROR:  syntax error at or near "ct1"
LINE 1: DELETE  ct1
                ^

********** Error **********

Я использую базу данных postgres.

Ответы [ 2 ]

3 голосов
/ 07 мая 2011

Используя Ранг , на самом деле я не совсем уверен в синтаксисе, потому что я не очень хорош в PostgreSQL, в любом случае, это всего лишь подсказка (чья-то поправка будет оценена):

DELETE FROM mytable
WHERE id NOT IN
(
   SELECT x.id FROM
   (
      SELECT id, RANK() OVER (PARTITION BY name ORDER BY id ASC) AS r
      FROM mytable
   ) x
   WHERE x.r = 1
)
3 голосов
/ 07 мая 2011

Вы можете попробовать это запустить несколько раз :

delete from mytable where id in (
    select max(id)
      from mytable
     group by name
    having count(1) > 1
);

Где несколько раз равно максимальному количеству повторений в столбце name.

В противном случае, вы можете попробовать этот более сложный запрос:

delete from mytable where id in (
    select id from mytable
    except 
    (
    select min(id)
      from mytable
     group by name
    having count(1) > 1
    union all
    select min(id)
      from mytable
     group by name
    having count(1) = 1
    )
);

Выполнение этого запроса только один раз должно удалить все, что вам нужно. Хотя не пробовал ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...