SQL удаляет записи с одинаковым идентификатором, оставляя 1 - PullRequest
2 голосов
/ 21 апреля 2011

Странный вопрос, я знаю. Я не хочу удалять все строки и начинать заново, но у нас есть таблица базы данных разработки, в которой некоторые строки имеют повторяющиеся идентификаторы, но разные значения.

Я хочу удалить все записи с дублирующими идентификаторами, чтобы я мог принудительно установить целостность данных в таблице для новой версии и построить отношения. На данный момент это идентификатор, который вставляется и генерируется кодом (устаревшим).

Из другого вопроса я получил это:

delete 
   t1 
from 
   tTable t1, tTable t2 
where 
   t1.locationName = t2.locationName and  
   t1.id > t2.id

Но это не сработает, поскольку идентификаторы одинаковы!

Как я могу удалить все записи, кроме одной, где идентификаторы совпадают? То есть удалить где количество записей с одинаковым ID> 1? Если это невозможно, тогда удастся удалить все записи с повторяющимися идентификаторами.

Ответы [ 3 ]

1 голос
/ 21 апреля 2011

В SQL Server 2005 и выше:

WITH    q AS
        (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY locationName ORDER BY id) rn
        FROM    tTable
        )
DELETE
FROM    q
WHERE   rn > 1
1 голос
/ 21 апреля 2011

Не уверен для mysql, но для базы данных MSServer вы можете использовать следующее

SET IDENTITY_INSERT [tablename] ON
SELECT DISTINCT col1, col2, col3 INTO temp_[tablename] FROM [tablename]
ALTER TABLE temp_[tablename] ADD IDcol INT IDENTITY
TRUNCATE TABLE [tablename]
INSERT INTO [tablename](IDcol, col1, col2, col3) SELECT IDcol, col1, col2, col3 FROM temp_[tablename]
DROP TABLE temp_[tablename]

Надеюсь, это поможет.

1 голос
/ 21 апреля 2011

Зависит от вашего сервера БД, но вы можете связать DELETE и LIMIT (MySQL) или TOP (сервер SQL).удалите исходную таблицу и скопируйте временную таблицу обратно в исходную.

...