2016-09-27 2 views
2

Я использую SQL Server. У меня есть SQL-таблица имеет более 20000 строк. У меня есть дубликат фильтра, используя следующий запрос.delete Duplicate Row SQL server

SELECT 
    Entity,ExpenseType,Amount,Description,APSupplierID,ExpenseReportID,Employee,ExpenseDate,COUNT(*) 
FROM 
    TotalsByGLCenter 
GROUP BY 
    Entity,ExpenseType,Amount,Description,APSupplierID,ExpenseReportID,Employee,ExpenseDate 
HAVING 
    COUNT(*) > 1 

сейчас я хочу удалить дубликат с SQL Server Как добавить удаление Следующее выше Запрос?

+0

Какой ваш «Основной ключ» в вашем Таблица? – rbr94

+0

Все повторяющиеся записи или вы хотите сохранить один из них? –

+0

Все дубликаты помещают P.Salmon – thenna

ответ

5
;WITH cte 
     AS (Select ROW_NUMBER() OVER (PARTITION BY Entity,ExpenseType,Amount,Description,APSupplierID,ExpenseReportID,Employee,ExpenseDate ORDER BY (SELECT 0)) RowNum 
      FROM TotalsByGLCenter) 
    Delete FROM cte 
    WHERE RowNum > 1; 

«ROW_NUMBER()» в приведенном выше запросе возвращает порядковый номер строки в пределах раздела результирующего набора, начиная с 1 для первой строки в каждой секции. Предложение ORDER BY определяет порядок, в котором значение ROW_NUMBER присваивается строкам в разделе. Предложение «PARTITION BY» используется здесь для разделения набора результатов на разделы;

Новый столбец RowNum показывает номера строк повторяющихся строк.

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

;WITH cte 
     AS (Select ROW_NUMBER() OVER (PARTITION BY Entity,ExpenseType,Amount,Description,APSupplierID,ExpenseReportID,Employee,ExpenseDate ORDER BY (SELECT 0)) RowNum,Entity,ExpenseType,Amount,Description,APSupplierID,ExpenseReportID,Employee,ExpenseDate 
      FROM TotalsByGLCenter) 
    Select * FROM cte 
    WHERE RowNum > 1; 
+0

удалить из cte? –

+0

@ P.Salmon, если вы не поняли ответ PLS, посмотрите эту статью http://blog.sqlauthority.com/2009/06/23/sql-server-2005-2008-delete-duplicate-rows/ – Mitz

+0

Отображение ошибки синтаксиса MItz – thenna

0

Вот (упрощенный) пример

drop table t 
create table t (id int) 

insert into t values (1),(1),(1),(2),(3),(3) 

;WITH CTE AS(
    select id,count(*) as dupes 
    from t 
    group by t.id 
    having count(*) > 1 

) 
DELETE t where t.id in (select cte.id from cte) 

результат

1> select * from t 
2> ; 
3> go 
id 
----------- 
      2 
0

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