我正在尝试修剪一个充满重复项和连接值的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
会产生错误。
有人可以帮忙吗?
答案 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;
啰嗦但你去了。