1

我正在尝试修剪一个充满重复和连接值的访问表(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

这会产生错误。

任何人都可以帮忙吗?

4

2 回答 2

0

我认为您想要Contam每个FederalSiteIdentifier. 您将需要一个GROUP BY子句。

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

如果该查询标识了您希望保留的行,请将其保存为qryRows2Keep,然后尝试以下DELETE查询:

DELECT FROM contam
WHERE
    Len(Contam) < DLookup(
            "MaxCont",
            "qryRows2Keep", 
            "FederalSiteIdentifier = '" & FederalSiteIdentifier & "'")

我假设FederalSiteIdentifier是文本数据类型。如果它是数字,则丢弃DLookup表达式中的单引号。

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

于 2013-01-09T18:23:04.577 回答
0

MAX 是一个聚合函数,只有使用 GROUP BY 语句才能执行这些操作。Access 在删除记录的方式上也很奇特。你不能离开加入和删除,所以你必须识别你不想要的记录,然后删除它们。

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

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;

长篇大论,但你去。

于 2013-01-09T18:23:33.303 回答