2009-12-21 3 views

ответ

1

Самый простой способ - скопировать все дубликаты в другую идентичную таблицу, удалить все из исходной таблицы, а затем вернуть дубликаты (как раз один раз для каждого уникального, конечно) из временной таблицы.

Например:

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 

Это лишь простой пример с одной колонкой. Очевидно, вам нужно будет настроить его для своей таблицы. Тогда не забудьте добавить первичный ключ к вашему столу ...

+0

Не удалось бы удалить объединение N записей из My_Table и 1 запись из Hold_Table и удалить их все? – Khb

+0

Да, вот почему вы затем вставляете их сразу после удаления –

+0

На, это не так просто. Если вы перейдете на дополнительный маршрут таблицы, я предпочел бы «sp_rename» оригинал, а затем вставить все уникальные строки (используя «SELECT DISTINCT * FROM Temp») в новую таблицу с исходным именем. –

0

Проверить этот сайт на support.microsoft.com: Site

Он может сказать вам много о том, как определить и т.д.

1

You сначала необходимо создать первичный ключ. Затем вы сможете запустить агрегированный запрос и посмотреть, сколько дубликатов есть и удалить на основе нового идентификатора. Затем вы можете удалить первичный ключ и сделать другое поле основным ключом, если вы этого захотите (или придерживаться того, который вы создали).

Я делал это много раз, когда фиксировал древние устаревшие базы данных.

+0

Сообщите мне, если вам нужно разъяснение по этому вопросу. –

0

Добавление это как еще один ответ, так как это другой подход ...

Вы также можете добавить новый столбец в таблице, сделать это один уникальный, а затем использовать это, чтобы удалить все, кроме одного из повторяющихся строк , Например:

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 
1

Если вы используете: SET ROWCOUNT 1

Вы можете получить SQL удалить только одну строку, и использовать любой техник вы предпочитаете, чтобы удалить одинаковые строки по одному.

Чтобы вернуться к нормальному поведению, используйте: SET ROWCOUNT 0

Однако, было бы целесообразно, по крайней мере, добавить столбец, который позволяет однозначно идентифицировать каждую строку, так что вы можете избежать этой проблемы в будущем. Далее делает трюк:

ALTER TABLE TableName ADD TableName_ID int IDENTITY NOT NULL 

Теперь вы можете просто: DELETE TableName WHERE TableName_ID = ? для каждого из ваших дублей.

Смежные вопросы