我有一张没有任何主键或唯一键的表。
如何删除重复记录?
你可以告诉我吗?答案 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