удаление дубликатов из таблицы без использования временной таблицы

У меня есть таблица (TableA) с таким содержимым:

Col1 ----- A B B B CC D 

Я хочу удалить только дубликаты значений без использования временной таблицы в Microsoft SQL Server . Может кто-нибудь мне помочь? финальная таблица должна выглядеть так:

 Col1 ----- A B CD 

благодаря 🙂

 WITH TableWithKey AS ( SELECT ROW_NUMBER() OVER (ORDER BY Col1) As id, Col1 As val FROM TableA ) DELETE FROM TableWithKey WHERE id NOT IN ( SELECT MIN(id) FROM TableWithKey GROUP BY val ) 

Можете ли вы использовать функцию row_number () ( http://msdn.microsoft.com/en-us/library/ms186734.aspx ) для разделения по столбцам, которые вы ищете обманы, и удалять, где номер строки не является 1?

Я полностью согласен с тем, что наличие уникального идентификатора сэкономит вам много времени.

Но если вы не можете использовать один (или если это чисто гипотетический), вот альтернатива: Определите количество строк для удаления (количество каждого отдельного значения -1), затем выполните цикл и удалите верхний X для каждого отдельного значения ,

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

 declare @name varchar(50) declare @sql varchar(max) declare @numberToDelete varchar(10) declare List cursor for select name, COUNT(name)-1 from #names group by name OPEN List FETCH NEXT FROM List INTO @name,@numberToDelete WHILE @@FETCH_STATUS = 0 BEGIN IF @numberToDelete > 0 BEGIN set @sql = 'delete top(' + @numberToDelete + ') from #names where name=''' + @name + '''' print @sql exec(@sql) END FETCH NEXT FROM List INTO @name,@numberToDelete END CLOSE List DEALLOCATE List 

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

Выберите сгруппированные данные в таблицу temp, затем обрезайте оригинал, после чего верните его в исходное.

Второе решение, я не уверен, что это сработает, но вы можете попробовать открыть таблицу непосредственно из SQL Management Studio и использовать CTRL + DEL для выбранных строк, чтобы удалить их. Это будет очень медленно, потому что вам нужно удалить каждую строку руками.

Вы можете удалить повторяющиеся строки с помощью курсора и DELETE .. WHERE CURRENT OF .

 CREATE TABLE Client ([name] varchar(100)) INSERT Client VALUES('Bob') INSERT Client VALUES('Alice') INSERT Client VALUES('Bob') GO DECLARE @history TABLE (name varchar(100) not null) DECLARE @cursor CURSOR, @name varchar(100) SET @cursor = CURSOR FOR SELECT name FROM Client OPEN @cursor FETCH NEXT FROM @cursor INTO @name WHILE @@FETCH_STATUS = 0 BEGIN IF @name IN (SELECT name FROM @history) DELETE Client WHERE CURRENT OF @cursor ELSE INSERT @history VALUES (@name) FETCH NEXT FROM @cursor INTO @name END 
Давайте будем гением компьютера.