2013-02-27 111 views
5

我有一個名爲table1的表具有重複值。它看起來像這樣:如何從SQL Server中的表中刪除重複的行

new 
pen 
book 
pen 
like 
book 
book 
pen 

但我想從該表中刪除重複的行並將其插入到被稱爲table2另一個表。

table2應該是這樣的:

new 
pen 
book 
like 

我怎樣才能做到這一點在SQL Server?

+0

您對此問題使用了'c#'標籤,因爲..?你到目前爲止嘗試過什麼?閱讀[FAQ]和[問] – 2013-02-27 18:50:51

+0

'new'和'like'在'table'中被複制到哪裏? – HABO 2013-02-27 19:46:57

+0

這個問題不是鏈接問題的重複,因爲a。與鏈接問題不同,此表沒有主鍵(這會否定鏈接問題中的大多數解決方案),以及b。它正在將數據傳輸到另一個表。 – user281806 2013-10-12 00:46:03

回答

1

假設領域被評爲name

INSERT INTO table2 (name) 
SELECT name FROM table1 GROUP BY name 

該查詢會得到大家的唯一名稱。

你甚至可以把它們放在一個表變量,如果你想:

DECLARE @Table2 TABLE (name VARCHAR(50)) 

INSERT INTO @Table2 (name) 
SELECT name FROM table1 GROUP BY name 

或者你可以使用一個臨時表:

CREATE TABLE #Table2 (name VARCHAR(50)) 

INSERT INTO @Table2 (name) 
SELECT name FROM table1 GROUP BY name 
+0

「從該表中刪除重複的行」 – Magnus 2013-02-27 18:52:05

+0

我怎樣才能創建table2與他們?@邁克爾 – meo 2013-02-27 18:52:08

+0

@Magnus:你說得對。感覺就像之間有一個編輯 - 我在第一次甚至第二次閱讀時都沒有看到。 – 2013-02-27 18:53:14

1

您可以用INSERTSELECT就做這個很容易從CTE您使用ROW_NUMBER(),如:

DECLARE @YourTable table (YourColumn varchar(10)) 
DECLARE @YourTable2 table (YourColumn varchar(10)) 
INSERT INTO @YourTable VALUES ('new') 
INSERT INTO @YourTable VALUES ('pen') 
INSERT INTO @YourTable VALUES ('book') 
INSERT INTO @YourTable VALUES ('pen') 
INSERT INTO @YourTable VALUES ('like') 
INSERT INTO @YourTable VALUES ('book') 
INSERT INTO @YourTable VALUES ('book') 
INSERT INTO @YourTable VALUES ('pen') 

;WITH OrderedResults AS 
(
SELECT 
    YourColumn, ROW_NUMBER() OVER (PARTITION BY YourColumn ORDER BY YourColumn) AS RowNumber 
    FROM @YourTable 
) 
INSERT INTO @YourTable2 
     (YourColumn) 
    SELECT YourColumn FROM OrderedResults 
     WHERE RowNumber=1 

SELECT * FROM @ YourTable2

OUTPUT:

--this will just remove them from your original table 
DECLARE @YourTable table (YourColumn varchar(10)) 
INSERT INTO @YourTable VALUES ('new') 
INSERT INTO @YourTable VALUES ('pen') 
INSERT INTO @YourTable VALUES ('book') 
INSERT INTO @YourTable VALUES ('pen') 
INSERT INTO @YourTable VALUES ('like') 
INSERT INTO @YourTable VALUES ('book') 
INSERT INTO @YourTable VALUES ('book') 
INSERT INTO @YourTable VALUES ('pen') 

;WITH OrderedResults AS 
(
SELECT 
    YourColumn, ROW_NUMBER() OVER (PARTITION BY YourColumn ORDER BY YourColumn) AS RowNumber 
    FROM @YourTable 
) 
DELETE OrderedResults 
    WHERE RowNumber!=1 

SELECT * FROM @YourTable 

OUTPUT:

YourColumn 
---------- 
book 
like 
new 
pen 

(4 row(s) affected) 

您可以在CTE在您使用ROW_NUMBER(),就像一個DELETE做到這一點很容易

YourColumn 
---------- 
new 
pen 
book 
like 

(4 row(s) affected) 
1

我發佈了一些事情g幾個星期前通過使用DELETE TOP X來刪除重複項。顯然,僅對於一組重複項。然而在評論中,我被Joshua Patchak給了這個小小的寶石。

;WITH cte(rowNumber) AS 
(SELECT ROW_NUMBER() OVER (PARTITION BY [List of Natural Key Fields] 
ORDER BY [List of Order By Fields]) 
FROM dbo.TableName) 

DELETE FROM cte WHERE rowNumber>1 

這將擺脫表中的所有重複項。
如果你想閱讀討論,這裏是原文。 Duplicate rows in a table.