sql删除1列重复的行

时间:2009-10-30 06:38:36

标签: sql sql-server-2005

我有一个microsoft sql 2005 db表,其中整行不重复,但是列是重复的。

1 aaa
1 bbb
1 ccc
2 abc
2 def

如何删除除第一列重复的所有行?

为了澄清我需要摆脱第二,第三和第五行。

6 个答案:

答案 0 :(得分:9)

在sql server 2005中尝试以下查询

WITH T AS (SELECT ROW_NUMBER()OVER(PARTITION BY id ORDER BY id) AS rnum,* FROM dbo.Table_1)
DELETE FROM T WHERE rnum>1

答案 1 :(得分:2)

我们将这些称为id和Col1列。

DELETE myTable T1
WHERE EXISTS
  (SELECT * FROM myTable T2
   WHERE T2.id = T1.id AND T2.Col1 > T1.Col1)     

编辑:正如Andomar所指出的,上面并没有摆脱完全重复的情况,其中id和Col1在不同的行中都是相同的。 这些可以按照以下方式处理:

(注意:上述查询为通用SQL ,以下内容适用于 MSSQL 2005 及以上)
它使用Common Table Expression(CTE)功能以及ROW_NUMBER()函数来生成独特的行值。它基本上与上面的结构相同,只是它现在使用“表”(CTE大多像一个表),它有一个真正独特的标识符键。
请注意,通过删除“AND T2.Col1 = T1.Col1”,我们生成一个查询,它可以在单个查询中处理两种类型的重复项(仅ID重复项以及Id和Col1重复项),即与Hamadri的类似方式解决方案(他/她的CTE中的PARTITION与此解决方案中的子查询具有相同的目的,基本上完成了相同的工作量)。根据具体情况,在两个步骤中处理这种情况可能更为可取,无论是在性能上还是其他方面。

WITH T AS
  (SELECT ROW_NUMBER() OVER (ORDER BY id, Col1) AS rn, id, Col1 FROM MyTable)
DELETE T AS T1
WHERE EXISTS
   (SELECT * 
    FROM T AS T2
    WHERE T2.id = T1.id AND T2.Col1 = T1.Col1
      AND T2.rn > T1.rn
   )   

答案 2 :(得分:1)

DELETE tableName as ta
WHERE col2 NOT IN (SELECT MIN(col2) FROM tableName AS t2 GROUP BY col1)

确保子选择返回要保留的行。

答案 3 :(得分:0)

试试这个。

DELETE FROM <TABLE_NAME_HERE> WHERE <SECOND_COLUMN_NAME_HERE> IN ("bbb","abc","def");

答案 4 :(得分:0)

SQL服务器不是我的原生SQL数据库,但可能是这样的?我们的想法是获取重复项并删除具有较大ROW_NUMBER的副本。这应该只留下第一个。我不知道这是你想要的,还是它能起作用,但逻辑​​似乎是合理的

DELETE T1
FROM T1 T2
WHERE T1.Col1 = T2.col1
AND T1.ROW_NUMBER() > T2.ROW_NUMBER()

如果SQL服务器无法处理这种处理,请随时纠正我:)

答案 5 :(得分:0)

- 使用ROW_NUMBER()

的另一个想法
Delete MyTable
Where Id IN
(
    Select T.Id FROM
    (
        SELECT ROW_NUMBER() OVER (PARTITION BY UniqueColumn ORDER BY Id) AS RowNumber FROM MyTable
    )T
    WHERE T.RowNumber > 1
)