如何在SQL Server中从表格中删除重复的行

7

我有一个名为table1的表格,其中存在重复值。它看起来像这样:

new
pen
book
pen
like
book
book
pen

但我想从表格中删除重复的行,并将它们插入到另一个名为 table2 的表格中。

table2 应该像这样:

new 
pen
book
like

我该如何在SQL Server中实现这个功能?


你在这个问题中使用了 c# 标签,是因为...?你到目前为止尝试了什么?请阅读 [FAQ] 和 [ask]。 - Soner Gönül
newliketable中是在哪里重复的? - HABO
这个问题与链接的问题不重复,因为a.与链接的问题不同,这个表没有主键(这使得链接问题中的大多数解决方案都无效),并且b.它正在将数据传输到另一个表。 - user281806
3个回答

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

从该表中删除重复的行。 - Magnus
我该如何使用它们创建table2?@Michael - meo
@Magnus:你说得对。感觉好像在那之间进行了编辑——我在第一次甚至第二次阅读时都没有看到。 - Mike Perrenoud
@MichaelPerrenoud 是的,你可能是对的。 - Magnus

1
您可以轻松地使用INSERT,从CTE中进行SELECT,并使用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

从@YourTable2中选择所有内容

输出:

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

(4 row(s) affected)

你可以轻松地通过在使用 ROW_NUMBER()CTE 上执行 DELETE 来完成此操作,例如:
--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

输出:
YourColumn
----------
new
pen
book
like

(4 row(s) affected)

1

我几周前发布了一篇关于使用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

这将清除表中所有的重复行。
如果您想阅读讨论,请查看原帖。在表格中删除重复行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接