删除基于三个列的重复记录,但保留第四列中具有最高值的记录

时间:2012-06-23 03:20:33

标签: sql date ms-access duplicates sql-delete

我已经阅读了很多关于处理重复项的问题,他们帮助我编写了我所拥有的SQL,但我的任务是删除不是基于重复字段的副本,而是删除另一个字段。

在我的项目中,我根据三个cols相等来定义重复项,但是有一个永远不会重复的col col事务日期/时间。我想保留最新的交易并抛弃旧的交易。

这是我已经做过的事情  SELECT Table_A.Fld1, Table_A.Fld2, Table_A.Fld3, Table_A.Fld4, Table_A.Date_Updated FROM Table_A INNER JOIN (SELECT Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 FROM Table_A GROUP BY Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 HAVING count(*)>1) AS Temp ON (Table_A.Fld4 = Temp.Fld4) AND (Table_A.Fld3 = Temp.Fld3) AND (Table_A.Fld2 = Temp.Fld2);

这会产生重复列表

FLD_reUpdates_qry
Fld2    Fld3        Fld4        Date_Updated
6   User_ID_lst 1394522856  6/21/2012 15:21:59
6   User_ID_lst 1394522856  6/21/2012 15:22:21
67  [Active?]   1099608160  6/19/2012 19:09:16
67  [Active?]   1099608160  6/19/2012 19:09:17
68  Url_lst     1107138998  6/21/2012 15:21:16
68  Url_lst     1107138998  6/21/2012 15:21:42
74  User_ID_lst 1044317178  6/21/2012 15:26:24
74  User_ID_lst 1044317178  6/21/2012 15:27:15
74  User_ID_lst 1044317178  6/21/2012 15:28:50

这很好,花花公子我有重复列表,你可以看到记录74有三个重复。但我想要的只是最新时间的重复。 所以我有这个查询..
SELECT max(date_updated) AS LatestUpdate, Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 FROM Table_A GROUP BY Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 HAVING count(1)> 1;
 产生以下列表......

FLD_LatestReupdates_Qry
LatestUpdate        Fld2    Fld3        Fld4
6/21/2012 15:22:21  6   User_ID_lst 1394522856
6/19/2012 19:09:17  67  [Active?]   1099608160
6/21/2012 15:21:42  68  Url_lst     1107138998
6/21/2012 15:28:50  74  User_ID_lst 1044317178


啊!现在我列出了我想要保留的内容,即使有记录74,我也只有最新的条目。但我真正想要的是删除其他副本。而这正是我似乎陷入精神障碍的地方。如何编写一个只删除较旧副本(保留最后一个重复项)而不删除任何其他非重复记录的查询?

3 个答案:

答案 0 :(得分:1)

使用您的查询 FLD_LatestReupdates_Qry 作为此代码中的子查询,我删除了重复的行,只留下那些带有最新date_updated的记录。这个DELETE的systax对应于Sql Server,如果你想要它用于不同的后端,它可能需要一些小的改动。

DELETE A 
FROM Table_A A
INNER JOIN 
( SELECT max(date_updated) AS LatestUpdate, Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 
    FROM Table_A 
GROUP BY Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 HAVING count(1)> 1 
) B
ON A.Fld2 = B.Fld2 AND A.Fld3 = B.Fld3 AND A.Fld4 = B.Fld4
WHERE A.date_updated < B.LatestUpdate

答案 1 :(得分:0)

现在您有一个选择要保留的查询,您可以创建一个删除查询,删除该查询未返回的任何内容。所以,你可以像这样包装你的查询:

DELETE FROM Table_A
WHERE date_updated NOT IN (
  SELECT max(date_updated) 
  FROM Table_A GROUP BY Table_A.Fld2, Table_A.Fld3, Table_A.Fld4 
  HAVING count(1)> 1    
)

答案 2 :(得分:0)

这里我更新SQL代码以删除仅留下第一条记录的重复项 您也可以在Access 2007中使用此代码....

DELETE *
    FROM Test
    WHERE ID NOT IN (SELECT * 
                        FROM (SELECT MIN(n.ID)
                                FROM Test n
                            GROUP BY n.Projects));

测试是表名..

项目是要删除重复项的字段名称

n 是一个对象,您可以使用相同的对象或根据需要进行更改