Boopalslm Ответов: 3

Как удалить строку одну за другой в SQL server 2005.


Я разрабатываю приложение windows с использованием базы данных назначения sql server 2005, но в моей базе данных хранятся некоторые дубликаты записей. Как удалить строку одну за другой в sql server 2005. Здесь я не использую в первичном ключе.
Экс:
Stuid телефон добавьте 1 добавьте 1 stuname
1 Тест Тест 123
2 B abc def 456
1 Тест Тест 123
4 C Ram ijkl 896

Выше моего примера sql-таблицы, Как удалить строку одну за другой.
Дайте мне какие-нибудь идеи.

Что я уже пробовал:

Как удалить строку одну за другой в sql server 2005.

Richard Deeming

Если вы не используете первичный ключ или какой-либо другой уникальный индекс, то как вы определите строку для удаления? Если вы скажете SQL удалить строку с ID = 1, то она будет удалена все строки с ID = 1.

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

3 Ответов

Рейтинг:
1

Richard Deeming

Вам нужно будет добавить уникальный столбец в вашу таблицу, чтобы вы могли различать разные копии одной и той же строки:

ALTER TABLE YourTable
ADD TempRowNumber int IDENTITY(1, 1) NOT NULL;

Затем вам нужно найти и удалить дубликаты строк. Предполагая, что вы заботитесь только о Stuid колонка:
DELETE
FROM
    T1
FROM
    YourTable As T1
WHERE
    Exists
    (
        SELECT 1
        FROM YourTable As T2
        WHERE T2.Stuid = T1.Stuid
        And T2.TempRowNumber < T1.TempRowNumber
    )
;

При необходимости вы можете удалить временный уникальный столбец и добавить соответствующее уникальное ограничение:
ALTER TABLE YourTable
DROP COLUMN TempRowNumber;
GO
ALTER TABLE YourTable
WITH CHECK
ADD CONSTRAINT UX_YourTable_Stuid UNIQUE (Stuid);
GO


Boopalslm

Выше ваш запрос работает хорошо, спасибо за ваш запрос, сэр. Большое спасибо.

Рейтинг:
0

RickZeeland

Что-то вроде этого:

WHILE ((SELECT TOP (1) [Stuid] FROM [MyTable] GROUP BY [Stuid] HAVING Count(*)>1) > 0)
BEGIN
	DELETE TOP (1) FROM MyTable
	WHERE ((Stuid) In (SELECT [Stuid] FROM [MyTable] As Tmp GROUP BY [Stuid] HAVING Count(*)>1 ))
END  


Richard Deeming

Это приведет к удалению все копии дублированного ряда. Я подозреваю, что ОП хочет оставить по одной копии каждой строки.

RickZeeland

Вы правы ! Я немного поторопился, я обновлю решение.

Рейтинг:
0

Peter Leow

Проверить это: https://support.microsoft.com/en-us/kb/139444[^]