Я тестирую что-то в Oracle и заполнил таблицу некоторыми примерами данных, но в процессе я случайно загрузил дублирующиеся записи, поэтому теперь я не могу создать первичный ключ, используя некоторые столбцы.
Как я могу удалить все повторяющиеся строки и оставить только одну из них?
От Спроси Тома
(исправлена пропущенная скобка)
источник
От DevX.com :
Где column1, column2 и т. Д. - это ключ, который вы хотите использовать.
источник
источник
Решение 1)
Решение 2)
Решение 3)
источник
создать таблицу t2 как выделенную * из t1;
источник
distinct *
возьмет каждую запись, которая отличается как минимум 1 символом в 1 столбце. Все, что вам нужно, это выбрать отдельные значения только из столбцов, которые вы хотите сделать первичными ключами - ответ Билла является отличным примером такого подхода.Вы должны сделать небольшой блок pl / sql, используя курсор для цикла, и удалить строки, которые вы не хотите сохранять. Например:
источник
Для выбора дубликатов можно использовать только формат запроса:
Таким образом, правильный запрос согласно другому предложению:
Этот запрос сохранит самую старую запись в базе данных по критериям, выбранным в
WHERE CLAUSE
.Oracle Certified Associate (2008)
источник
Самый быстрый способ для действительно больших столов
Создайте таблицу исключений со структурой ниже: exceptions_table
Попробуйте создать уникальное ограничение или первичный ключ, который будет нарушен дубликатами. Вы получите сообщение об ошибке, потому что у вас есть дубликаты. Таблица исключений будет содержать строки для повторяющихся строк.
Присоединяйся к своей таблице с помощью exception__table по rowid и удалите дубли
Если количество удаляемых строк велико, создайте новую таблицу (со всеми разрешениями и индексами), которая не будет объединяться с помощью exceptions_table по rowid, и переименуйте исходную таблицу в таблицу original_dups и переименуйте new_table_with_no_dups в исходную таблицу.
источник
Используя rowid-
Используя самостоятельное соединение
источник
Решение 4)
источник
1. решение
2. sloution
3.solution
4. решение
источник
5. решение
источник
и вы также можете удалить дубликаты записей другим способом
источник
источник
источник
источник
Для лучшей производительности вот что я написал:
(см. План выполнения)
источник
Проверьте ниже скрипты -
1.
2.
3.
Вы увидите здесь 6 записей.
4. запустить под запросом -
select * from test;
Вы увидите, что дубликаты записей были удалены.
Надеюсь, что это решит ваш запрос. Спасибо :)
источник
Я не видел ответов, которые бы использовали общие табличные выражения и оконные функции. Это то, с чем мне легче всего работать.
Что стоит отметить:
1) Мы проверяем дублирование только в полях раздела.
2) Если у вас есть причина выбрать один дубликат среди других, вы можете использовать предложение order by, чтобы в этой строке было row_number () = 1
3) Вы можете изменить сохраненный дубликат числа, изменив конечное условие where на «Where RN> N» с N> = 1 (я думал, что N = 0 удалит все строки, которые имеют дубликаты, но он просто удалит все строки) ,
4) Добавлено поле «Сумма раздела» в запросе CTE, в котором каждая строка будет помечена номерами строк в группе. Поэтому, чтобы выбрать строки с дубликатами, включая первый элемент, используйте «WHERE cnt> 1».
источник
источник
решение :
источник