2013-04-11 45 views
2

我試圖刪除部分重複行;一些鍵值相同的行。要做到這一點,我必須根據col來選擇要刪除的重複行。在刪除部分重複行時遇到問題

如:數據表

col1, col2, col3 
1,  1, 1 
2,  2, 2 
1,  1, 2 
2,  2, 3 

我想擺脫那些在山坳1和2,並保持該行的重複行的是最高的,導致

col1, col2, col3 
1,  1, 2 
2,  2, 3 

我覺得COL3要走的路是col 1 and 2distinct聲明,但我在col3中遇到問題的結果。

SELECT DISTINCT [col1], [col2] FROM [table] 

任何想法?

回答

0

得到它歸功於另一個StackOverflow的帖子...

SELECT * 
FROM [TABLE] a 
    LEFT JOIN [TABLE] a2 
     ON a.col3<a2.col3 AND a.col1=a2.col1 and a.col2=a2.col2 
WHERE a2.col2 IS NULL 
0

嘗試添加UNIQUE INDEX,像這樣的:

ALTER IGNORE TABLE tablename ADD UNIQUE INDEX idx_name (col1, col2); 

這將刪除所有重複的行,並防止重複插入的未來。您可能希望在執行此類操作之前進行備份...

+0

好的謝謝。我如何處理獨特的索引? – Fearghal 2013-04-11 10:48:39

+0

它如何知道我想放棄最大Col3? – Fearghal 2013-04-11 10:52:46

+0

好吧即時通訊錯誤,'未知的對象IGNORE',然後我刪除忽略,我得到不正確的附近索引 - ALTER TABLE [TABLENAME] ADD UNIQUE INDEX idx_name([col1],[col2]); – Fearghal 2013-04-11 10:58:16

0

此選擇是否爲您提供了您要查找的結果?

select [col1], [col2], max([col3]) from [table3] group by col1,col2 

也許你可以插入這個選擇的結果到表中,並用新的表替換舊的表?我認爲這可能不是最好的解決方案,但也許這個查詢可以幫助你找到你正在尋找的東西。

+0

沒有,因爲這不會給我所有其他columns回來,col4/5/6/7/8/9,我應該在例子中顯示。 – Fearghal 2013-04-11 12:36:26

1
DELETE t 
FROM dbo.test83 t 
WHERE NOT EXISTS (
        SELECT 1 
        FROM dbo.test83 t2 
        WHERE t.Col1 = t2.Col1 
        AND t.Col2 = t2.Col2 
        HAVING MAX(t2.col3) = t.col3 
       ) 

演示上SQLFiddle

此外,在SQLServer2005的+,你可以使用選項與CTE和ROW_NUMBER()排序函數

;WITH cte AS 
(  
    SELECT ROW_NUMBER() OVER(PARTITION BY t.Col1, t.Col2 ORDER BY t.Col3 DESC) AS rn 
    FROM dbo.test83 t 
) 
    DELETE 
    FROM cte 
    WHERE rn > 1 
+0

對不起,延遲解決了,感謝另一個stackOverflow文章.... – Fearghal 2013-04-11 12:30:04

+0

點雖然,只是測試它,它是正確的 - 謝謝一個工廠小夥子! – Fearghal 2013-04-11 12:38:57