关于删除记录

时间:2009-12-21 13:17:35

标签: sql sql-server

我有一张没有任何主键或唯一键的表。

如何删除重复记录?

你可以告诉我吗?

5 个答案:

答案 0 :(得分:1)

最简单的方法是将所有重复项复制到另一个相同的表中,从原始表中删除它们,然后从临时表中放回重复项(当然每个唯一的一次)。

例如:

BEGIN TRANSACTION

CREATE TABLE Holding_Table (my_string VARCHAR(20) NOT NULL)

INSERT INTO Holding_Table (my_string)
SELECT my_string
FROM My_Table
GROUP BY my_string
HAVING COUNT(*) > 1

DELETE MT
FROM Holding_Table HT
INNER JOIN My_Table MT ON MT.my_string = HT.my_string

INSERT INTO My_Table (my_string)
SELECT my_string
FROM Holding_Table

DROP TABLE Holding_Table

COMMIT TRANSACTION

这只是一个列的简单示例。你需要明确地为你的桌子调整它。然后一定要在表格中添加一个主键......

答案 1 :(得分:1)

您必须先创建主键。然后,您将能够运行聚合查询并查看有多少重复项,并根据新ID进行删除。然后,如果您愿意,可以删除主键并将另一个字段作为主键(或坚持使用您创建的字段)。

在修复古老的遗留数据库时,我已多次这样做了。

答案 2 :(得分:1)

如果您使用:SET ROWCOUNT 1

您可以让SQL只删除一行,并使用您喜欢的任何技术一次删除一行相同的行。

要恢复正常行为,请使用:SET ROWCOUNT 0

但是,建议至少添加一个允许您唯一标识每一行的列,以便将来可以避免此问题。以下是诀窍:

ALTER TABLE TableName ADD TableName_ID int IDENTITY NOT NULL

现在您可以简单地为每个重复项添加DELETE TableName WHERE TableName_ID = ?

答案 3 :(得分:0)

在support.microsoft.com上查看此网站:Site

它可以告诉你很多如何识别等等。

答案 4 :(得分:0)

将此添加为另一个答案,因为它是一种不同的方法......

您还可以向表中添加一个新列,使其唯一,然后使用该列删除除一个重复行之外的所有列。例如:

ALTER TABLE My_Table
ADD my_id INT IDENTITY NOT NULL

DELETE
     MT1
FROM
     My_Table MT1
WHERE EXISTS (
          SELECT
               *
          FROM
               My_Table MT2
          WHERE
               MT2.my_string = MT1.my_string AND
               MT2.my_id < MT1.my_id)

ALTER TABLE My_Table
DROP COLUMN my_id