HI У меня есть таблица, у которой нет первичного ключа или уникального ключа.Что касается удаления записи
Как удалить дубликаты записей?
Может ли кто-нибудь из вас сказать мне?
HI У меня есть таблица, у которой нет первичного ключа или уникального ключа.Что касается удаления записи
Как удалить дубликаты записей?
Может ли кто-нибудь из вас сказать мне?
Самый простой способ - скопировать все дубликаты в другую идентичную таблицу, удалить все из исходной таблицы, а затем вернуть дубликаты (как раз один раз для каждого уникального, конечно) из временной таблицы.
Например:
BEGIN TRANSACTION
CREATE TABLE Holding_Table (my_string VARCHAR(20) NOT NULL)
INSERT INTO Holding_Table (my_string)
SELECT my_string
FROM My_Table
GROUP BY my_string
HAVING COUNT(*) > 1
DELETE MT
FROM Holding_Table HT
INNER JOIN My_Table MT ON MT.my_string = HT.my_string
INSERT INTO My_Table (my_string)
SELECT my_string
FROM Holding_Table
DROP TABLE Holding_Table
COMMIT TRANSACTION
Это лишь простой пример с одной колонкой. Очевидно, вам нужно будет настроить его для своей таблицы. Тогда не забудьте добавить первичный ключ к вашему столу ...
Проверить этот сайт на support.microsoft.com: Site
Он может сказать вам много о том, как определить и т.д.
You сначала необходимо создать первичный ключ. Затем вы сможете запустить агрегированный запрос и посмотреть, сколько дубликатов есть и удалить на основе нового идентификатора. Затем вы можете удалить первичный ключ и сделать другое поле основным ключом, если вы этого захотите (или придерживаться того, который вы создали).
Я делал это много раз, когда фиксировал древние устаревшие базы данных.
Сообщите мне, если вам нужно разъяснение по этому вопросу. –
Добавление это как еще один ответ, так как это другой подход ...
Вы также можете добавить новый столбец в таблице, сделать это один уникальный, а затем использовать это, чтобы удалить все, кроме одного из повторяющихся строк , Например:
ALTER TABLE My_Table
ADD my_id INT IDENTITY NOT NULL
DELETE
MT1
FROM
My_Table MT1
WHERE EXISTS (
SELECT
*
FROM
My_Table MT2
WHERE
MT2.my_string = MT1.my_string AND
MT2.my_id < MT1.my_id)
ALTER TABLE My_Table
DROP COLUMN my_id
Если вы используете: SET ROWCOUNT 1
Вы можете получить SQL удалить только одну строку, и использовать любой техник вы предпочитаете, чтобы удалить одинаковые строки по одному.
Чтобы вернуться к нормальному поведению, используйте: SET ROWCOUNT 0
Однако, было бы целесообразно, по крайней мере, добавить столбец, который позволяет однозначно идентифицировать каждую строку, так что вы можете избежать этой проблемы в будущем. Далее делает трюк:
ALTER TABLE TableName ADD TableName_ID int IDENTITY NOT NULL
Теперь вы можете просто: DELETE TableName WHERE TableName_ID = ?
для каждого из ваших дублей.
Не удалось бы удалить объединение N записей из My_Table и 1 запись из Hold_Table и удалить их все? – Khb
Да, вот почему вы затем вставляете их сразу после удаления –
На, это не так просто. Если вы перейдете на дополнительный маршрут таблицы, я предпочел бы «sp_rename» оригинал, а затем вставить все уникальные строки (используя «SELECT DISTINCT * FROM Temp») в новую таблицу с исходным именем. –