Как я могу удалить повторяющиеся строки там, где их нет unique row id
?
Мой стол
col1 col2 col3 col4 col5 col6 col7
john 1 1 1 1 1 1
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
sally 2 2 2 2 2 2
Я хочу остаться со следующим после удаления дубликата:
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
Я пробовал несколько запросов, но я думаю, что они зависят от наличия идентификатора строки, так как я не получаю желаемого результата. Например:
DELETE
FROM table
WHERE col1 IN (
SELECT id
FROM table
GROUP BY id
HAVING (COUNT(col1) > 1)
)
mysql
sql
sql-server-2008
duplicates
sql-delete
Fearghal
источник
источник
Ответы:
Я как КТР и
ROW_NUMBER
как две совокупности позволяют нам видеть , какие строки будут удалены (или обновлены), поэтому просто изменитьDELETE FROM CTE...
наSELECT * FROM CTE
:DEMO (результат другой; я предполагаю, что это из-за опечатки с вашей стороны)
Этот пример определяет дубликаты по одному столбцу
col1
из-заPARTITION BY col1
. Если вы хотите включить несколько столбцов, просто добавьте их вPARTITION BY
:источник
AND COl1='John'
). Обычно вы должны применять фильтр в CTE....FROM dbo.Table1 WHERE Col1='John'
. Вот скрипка: sqlfiddle.com/#!6/fae73/744/0set rowcount 1 delete from t1 where col1=1 and col2=1
как показано здесьЯ бы предпочел CTE для удаления повторяющихся строк из таблицы сервера SQL
настоятельно рекомендуем следовать этой статье: http://codaffection.com/sql-server-article/delete-duplicate-rows-in-sql-server/
источник
Без использования,
CTE
иROW_NUMBER()
вы можете просто удалить записи, просто используя группу с помощьюMAX
функции здесь и примеристочник
MIN(ID)
источник
Пожалуйста, смотрите ниже способ удаления тоже.
Создал образец таблицы с именем
@table
и загрузил ее с заданными данными.Примечание: если вы даете все столбцы в
Partition by
детали, тоorder by
не имеют большого значения.Я знаю, вопрос задают три года назад, и мой ответ - еще одна версия того, что Тим опубликовал, но публикация только в том случае, если это полезно для всех.
источник
Если у вас нет ссылок, таких как внешние ключи, вы можете сделать это. Я делаю это много, когда проверяю доказательства концепции, а данные теста дублируются.
Зайдите в проводник объектов и удалите старую таблицу.
Переименуйте новую таблицу с именем старой таблицы.
источник
У Microsoft есть очень аккуратное руководство по удалению дубликатов. Проверять, выписываться http://support.microsoft.com/kb/139444
Вкратце, вот самый простой способ удалить дубликаты, когда у вас есть всего несколько строк для удаления:
myprimarykey - это идентификатор строки.
Я установил rowcount в 1, потому что у меня было только две строки, которые были продублированы. Если бы у меня было 3 дублированных строки, я бы установил rowcount в 2, чтобы он удалял первые две, которые он видит, и оставлял только одну в таблице t1.
Надеюсь, это кому-нибудь поможет
источник
Попробуй использовать:
источник
После попытки предложенного решения выше, это работает для небольших средних таблиц. Я могу предложить это решение для очень больших таблиц. так как он работает в итерациях.
LargeSourceTable
sp_rename 'LargeSourceTable', 'LargeSourceTable_Temp'; GO
LargeSourceTable
снова, но теперь добавьте первичный ключ со всеми столбцами, которые определяют дубликаты, добавьтеWITH (IGNORE_DUP_KEY = ON)
Например:
CREATE TABLE [dbo].[LargeSourceTable] ( ID int IDENTITY(1,1), [CreateDate] DATETIME CONSTRAINT [DF_LargeSourceTable_CreateDate] DEFAULT (getdate()) NOT NULL, [Column1] CHAR (36) NOT NULL, [Column2] NVARCHAR (100) NOT NULL, [Column3] CHAR (36) NOT NULL, PRIMARY KEY (Column1, Column2) WITH (IGNORE_DUP_KEY = ON) ); GO
Снова создайте представления, которые вы отбросили в первую очередь для новой созданной таблицы.
Теперь, запустите следующий сценарий sql, вы увидите результаты в 1000000 строк на странице, вы можете изменить номер строки на странице, чтобы увидеть результаты чаще.
Обратите внимание, что я включил
IDENTITY_INSERT
и выключил, потому что один столбец содержит автоматически добавочный идентификатор, который я также копируюSET IDENTITY_INSERT LargeSourceTable ON DECLARE @PageNumber AS INT, @RowspPage AS INT DECLARE @TotalRows AS INT declare @dt varchar(19) SET @PageNumber = 0 SET @RowspPage = 1000000
select @TotalRows = count (*) from LargeSourceTable_TEMP
SET IDENTITY_INSERT LargeSourceTable OFF
источник
Есть два решения в
mysql
:A) Удалите дублирующиеся строки, используя
DELETE JOIN
операторЭтот запрос дважды обращается к таблице контактов, поэтому использует псевдоним таблицы
t1
иt2
.Выход:
Если вы хотите удалить повторяющиеся строки и сохранить их
lowest id
, вы можете использовать следующую инструкцию:Б) Удалить дубликаты строк, используя промежуточную таблицу
Ниже показаны шаги по удалению повторяющихся строк с использованием промежуточной таблицы:
1. Создайте новую таблицу со структурой, аналогичной исходной таблице, в которой вы хотите удалить повторяющиеся строки.
2. Вставьте отдельные строки из исходной таблицы в непосредственную таблицу.
3. Вставьте отдельные строки из исходной таблицы в непосредственную таблицу.
Шаг 1. Создайте новую таблицу, структура которой совпадает с исходной таблицей:
Шаг 2. Вставьте отдельные строки из исходной таблицы в новую таблицу:
Шаг 3. удалите исходную таблицу и переименуйте непосредственную таблицу в исходную.
Источник: http://www.mysqltutorial.org/mysql-delete-duplicate-rows/
источник
источник
Вам нужно сгруппировать дубликаты записей в соответствии с полями, затем сохранить одну из записей и удалить остальные. Например:
источник
Удаление дубликатов из огромной (несколько миллионов записей) таблицы может занять много времени. Я предлагаю вам сделать массовую вставку во временную таблицу выбранных строк, а не удалять.
источник
Это может быть сделано многими способами на сервере sql, самый простой способ сделать это: вставить отдельные строки из таблицы повторяющихся строк в новую временную таблицу. Затем удалите все данные из таблицы повторяющихся строк, затем вставьте все данные из временной таблицы, в которой нет дубликатов, как показано ниже.
Удалите повторяющиеся строки, используя Common Table Expression (CTE)
источник
источник
Со ссылкой на https://support.microsoft.com/en-us/help/139444/how-to-remove-duplicate-rows-from-a-table-in-sql-server
Идея удаления дубликатов включает в себя
Шаг за шагом
источник
Если у вас есть возможность временно добавить столбец в таблицу, это решение подойдет мне:
Затем выполните УДАЛЕНИЕ, используя комбинацию MIN и GROUP BY
Убедитесь, что УДАЛЕНИЕ выполнено правильно:
В результате не должно быть строк с числом больше 1. Наконец, удалите столбец rowid:
источник
Другой способ удаления дублированных строк без потери информации за один шаг:
источник
Ого, я чувствую себя настолько глупо, когда готов ответить на все эти вопросы, они похожи на ответы экспертов со всеми CTE и временными таблицами и т. Д.
И все, что я сделал, чтобы заставить его работать, было просто агрегировать столбец ID с помощью MAX.
ПРИМЕЧАНИЕ: вам может потребоваться запустить его несколько раз, чтобы удалить дубликаты, так как это приведет к удалению только одного набора дублирующихся строк за раз.
источник
источник
источник