1

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

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

这是我已经拥有的
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 用户 ID_lst 1394522856 2012 年 6 月 21 日 15:21:59
6 用户 ID_lst 1394522856 2012 年 6 月 21 日 15:22:21
67 [活跃?] 1099608160 2012 年 6 月 19 日 19:09:16
67 [活动?] 1099608160 2012 年 6 月 19 日 19:09:17
68 Url_lst 1107138998 2012 年 6 月 21 日 15:21:16
68 Url_lst 1107138998 2012 年 6 月 21 日 15:21:42
74 用户 ID_lst 1044317178 2012 年 6 月 21 日 15:26:24
74 用户 ID_lst 1044317178 2012 年 6 月 21 日 15:27:15
74 用户 ID_lst 1044317178 2012 年 6 月 21 日 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
最新更新 Fld2 Fld3 Fld4
2012 年 6 月 21 日 15:22:21 6 User_ID_lst 1394522856
2012 年 6 月 19 日 19:09:17 67 [活动?] 1099608160
2012 年 6 月 21 日 15:21:42 68 Url_lst 1107138998
2012 年 6 月 21 日 15:28:50 74 用户 ID_lst 1044317178


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

4

3 回答 3

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
于 2012-06-23T04:36:58.587 回答
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    
)
于 2012-06-23T03:23:44.270 回答
0

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

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

测试是一个表名..

Projects是要消除重复项的字段名称

n是一个对象,您可以使用相同的对象或随意更改

于 2013-01-04T17:31:38.920 回答