Дедупликация таблицы sqlite3 без ключа

#sql #sqlite

#sql #sqlite

Вопрос:

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

Спасибо!

Комментарии:

1. вам необходимо предоставить более подробную информацию, схему таблицы и образцы данных

2. Общее замечание: обычно проще скопировать строки, которые вы хотите сохранить, в новую таблицу, чем удалять из существующей таблицы. Обычно вы можете добавить порядковый номер к «дубликатам», используя подзапрос (например, с ROW_NUMBER помощью функции), а затем сохранить в основном запросе только строки с порядковым номером 1.

Ответ №1:

Если вы не создали таблицу без rowid, ваша таблица имеет rowid as PRIMARY KEY .
Используйте его для удаления дубликатов:

 DELETE FROM tablename
WHERE rowid NOT IN (
  SELECT MAX(rowid) 
  FROM tablename
  GROUP BY columnname
)
 

Измените columnname на имя столбца, который дублируется.
Смотрите упрощенную демонстрацию.

Комментарии:

1. Спасибо! Это именно то, что мне было нужно.

2. Готово! Я немного новичок в Stack Overflow. Есть ли здесь какой-нибудь эквивалент Reddit Karma, который я могу вам дать?

3. @DanIrwin я не знаю, что такое карма Reddit. Когда ваша репутация достигнет 15 (я думаю), вы также сможете проголосовать за ответы, нажав на стрелку вверх.

Ответ №2:

Предположим, вам нужно обновить значения id столбца, чтобы они были уникальными, создайте новую таблицу, такую как

 CREATE TABLE tab2(
   ID INTEGER PRIMARY KEY AUTOINCREMENT,
   <other columns within the "tab" table>
)
 

и заполните эту таблицу с помощью аналитической функции ROW_NUMBER()

 INSERT INTO tab2
SELECT ROW_NUMBER() OVER () AS id, the other columns
  FROM tab t
 

а затем переименовать tab2 в tab после удаления tab

 DROP TABLE tab;
ALTER TABLE tab2 RENAME TO tab
 

Demo