【发布时间】:2019-03-27 00:48:04
【问题描述】:
我只需要保留一个重复值的行,即删除不是具有重复值的“第一”行的每一行。
我有一个名为 ART_NEW 的表格:
PHARMACODE | GTIN | {Other stuff}
111 1234 ...
- PHARMACODE 是主键(整数)
- GTIN 是另一个整数,据说是唯一的,但有时会发生冲突。
此表的数据源正准备从 PHARMACODE 转换为 GTIN 作为主键,但此转换尚未完成。我不以任何方式控制源。
要在某些应用程序中使用 GTIN 作为 PK,我需要删除所有重复 GTIN 的行(所有具有相同 GTIN 的行描述相同的产品,其描述略有不同,所以它删除哪一行和不删除哪一行都没有关系,只要我最终只有一行用于特定 GTIN 值)。
以下查询完全符合我的需要,但速度非常慢(在 350'000 条记录中执行时间超过 1 分钟,其中 120 行具有重复的 GTIN 值):
DELETE *
FROM ART_NEW
WHERE ART_NEW.PHARMACODE IN
(SELECT PHARMACODE FROM
(SELECT
ART_NEW.[PHARMACODE],
ART_NEW.GTIN,
(SELECT Count(*)
FROM ART_NEW As X
WHERE X.GTIN = ART_NEW.GTIN
AND X.PHARMACODE <= ART_NEW.PHARMACODE) AS SeqNo
FROM ART_NEW
WHERE ART_NEW.[GTIN] In
(SELECT [GTIN] FROM [ART_NEW] As Tmp GROUP BY [GTIN] HAVING Count(*)>1))
WHERE SeqNo > 1);
如何优化此代码?或者,是否有更好的方法来实现我删除每一行但具有重复 GTIN 值的每一行的目标?
【问题讨论】:
-
在使用 DAO 的 VBA 中,循环通过排序的记录集,并且对于每条记录,存储 GTIN 并将其与前一个记录中存储的 GTIN 进行对比。如果满足规则,删除记录并继续。