#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