2016-09-27 345 views
2

我正在使用SQL Server。我有創建SQL表有超過20000行。我有過濾器重複使用以下查詢。刪除重複行SQL服務器

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如果你不清楚的答案請看看這篇文章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

您也可以創建一個具有相同結構的新常規表格,然後刪除您的原始表格,然後將新表格重命名爲與原始表格相同的名稱