2013-02-27 17 views
5

Mam tabelę o nazwie table1, która ma zduplikowane wartości. Wygląda to tak:sposób usuwania duplikatów wierszy z tabeli w SQL Server

new 
pen 
book 
pen 
like 
book 
book 
pen 

ale chcę usunąć zduplikowane wiersze z tej tabeli i wstawić je do innej tabeli o nazwie table2.

table2 powinna wyglądać następująco:

new 
pen 
book 
like 

Jak mogę to zrobić w programie SQL Server?

+0

Użyłeś znacznika "C#" dla tego pytania, ponieważ ...? A co próbowaliście do tej pory? Przeczytaj [FAQ] i [pytaj] –

+0

Skąd się wzięły "nowe" i "jak" w "tabeli"? – HABO

+0

To pytanie nie jest duplikatem połączonego pytania, ponieważ. w przeciwieństwie do połączonego pytania ta tabela nie ma klucza głównego (który neguje większość rozwiązań w połączonym pytaniu), oraz b. przenosi dane do innej tabeli. – user281806

Odpowiedz

1

Załóżmy pole nazwano name:

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

że kwerenda będzie Ci wszystkie unikalne nazwy.

Można nawet umieścić je w zmiennej tabeli jeśli chcesz:

DECLARE @Table2 TABLE (name VARCHAR(50)) 

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

lub można użyć tabeli temp:

CREATE TABLE #Table2 (name VARCHAR(50)) 

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

"usuń zduplikowane wiersze z tej tabeli" – Magnus

+0

jak mogę utworzyć w nich tabelę 2? @ Michael – meo

+0

@Magnus: masz rację. Wydaje się, że była tam jakakolwiek zmiana - nie widziałem tego w pierwszym, a nawet drugim czytaniu. –

1

Można to zrobić łatwo z INSERT że SELECT s od CTE gdzie używasz ROW_NUMBER(), jak:

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

WYJŚCIE:

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

(4 row(s) affected) 

Można to zrobić łatwo z DELETE na CTE gdzie można wykorzystać ROW_NUMBER(), jak:

--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 

WYJŚCIE:

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

(4 row(s) affected) 
1

Wysłałem coś g o usunięciu duplikatów kilka tygodni temu za pomocą DELETE TOP X. Oczywiście dla pojedynczego zestawu duplikatów oczywiście. Jednak w komentarzach dostałem ten mały klejnot Joshua Patchaka.

;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 

Spowoduje to pozbycie się wszystkich duplikatów w tabeli.
Oto oryginalny post, jeśli chcesz przeczytać dyskusję. Duplicate rows in a table.

Powiązane problemy