Access删除除最大值以外的所有内容

时间:2013-01-09 18:10:00

标签: sql ms-access ms-access-2007

我正在尝试修剪一个充满重复项和连接值的Access表(contam)。

表格如下所示

FederalSiteIdentifier Contam
001 1
001 1, 2
001 1, 2, 3
001 1, 2, 3, 4
002 1
003 1
003 1, 2
003 1, 2, 3

我只想为每个ID保留最后一个 - 最长的条目,但无法找到在Access SQL中执行此操作的正确方法。

在做了一些阅读后,我尝试了这个简单的代码:

SELECT FederalSiteIdentifier, Max(Contam) as MaxCont
FROM contam
ORDER BY FederalSiteIdentifier

会产生错误。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

我认为您希望每个Contam的{​​{1}}值的最大长度。您需要一个FederalSiteIdentifier条款。

GROUP BY

如果该查询标识了您要保留的行,请将其另存为 qryRows2Keep ,然后尝试此SELECT FederalSiteIdentifier, Max(Len(Contam)) as MaxCont FROM contam GROUP BY FederalSiteIdentifier 查询:

DELETE

我认为DELECT FROM contam WHERE Len(Contam) < DLookup( "MaxCont", "qryRows2Keep", "FederalSiteIdentifier = '" & FederalSiteIdentifier & "'") 是文本数据类型。如果是数字,则丢弃FederalSiteIdentifier表达式中的单引号。

在尝试此未经测试的建议之前,请确保您已备份数据。 : - )

答案 1 :(得分:0)

MAX是一个聚合函数,只有在使用GROUP BY语句时才能执行这些操作。访问在删除记录的方式上也非常特殊。您不能离开加入和删除,因此您必须识别您不想要的记录,然后将其删除。

创建一个新列,以便我们可以选择要保留的记录。

ALTER TABLE contam ADD Keep BIT NOT NULL DEFAULT 0;

现在识别记录并更新表格

UPDATE c
SET    keep = 1
FROM   contam AS c
       INNER JOIN (
                  SELECT FederalSiteIdentifier, Max(Len(Contam)) as MaxCont
                  FROM contam
                  GROUP BY FederalSiteIdentifier
                  ORDER BY FederalSiteIdentifier
                  ) AS maxc
         ON c.FederalSiteIdentifier = maxc.FederalSiteIdentifier
         AND Len(c.Contam) = maxc.MaxCont;

请注意GROUP BY行...这就是你错过了给你一个错误的东西..

最后执行删除

 DELETE FROM contam
 WHERE keep = 0;

您现在可以删除额外的列

ALTER TABLE contam DROP COLUMN Keep;

啰嗦但你去了。