我已经阅读了很多关于处理重复项的问题,他们帮助我编写了我所拥有的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,我也只有最新的条目。但我真正想要的是删除其他副本。而这正是我似乎陷入精神障碍的地方。如何编写一个只删除较旧副本(保留最后一个重复项)而不删除任何其他非重复记录的查询?
答案 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 是一个对象,您可以使用相同的对象或根据需要进行更改