2011-06-27 148 views
0

我使用sql删除重复记录,但它不工作。谁能帮我。如何从表sql服务器删除重复记录

我的SQL是

delete from VehicleInfoForParts where 
Stock_Code not in 
(
select max(Stock_Code) from VehicleInfoForParts group by stock_code,makeid,modelid 
) 

感谢

+0

确保以下查询仅返回要保留的ID列表。通过stock_code,makeid,modelid从VehicleInfoForParts组中选择max(Stock_Code) –

回答

3

如果你在SQL Server 2005和了,你可以用一个CTE(公共表表达式)就实现这一目标:

;WITH DupData AS 
(
    SELECT Stock_Code, MakeID, ModelID, 
     ROW_NUMBER() OVER(PARTITION BY stock_code,makeid,modelid ORDER BY Stock_Code DESC) 'RowNum' 
    FROM 
     dbo.VehicleInfoForParts 
) 
DELETE FROM DupData 
WHERE RowNum > 1 

基本上,CTE中的SELECT语句按照(stock_code,makeid,modelid)对数据进行分组 - 即这三个元素中的每个“组”都从一开始获取连续的row_number。数据按照stock_code的顺序排列,因此最大的数字是第一个数字,因为它与RowNum = 1一致 - 因此其他数据(具有RowNum > 1)是重复的,可以删除。

1

您正在按照您希望获得最大值的列进行分组。你可能需要做的是为表中的每一行删除一行,其中该行的主ID不是最大值(或者如果第二行出错,则为最小值)。

DELETE 
FROM VehicleInfoForParts t1 
WHERE PrimaryID NOT IN (SELECT MIN(PrimaryID) FROM VehicleInfoForParts t2 WHERE t2.Stock_Code = t1.Stock_Code) 
0

以下查询对删除重复行非常有用。此示例中的表具有标识作为标识列,具有重复数据的列是列1,列2和列3。

DELETE 

FROM TableName 

WHERE ID NOT IN 

(

SELECT MAX(ID) 

FROM TableName 

GROUP BY Column1, Column2, Column3 

)