我在Access中有一个查找重复记录的查询。我想删除它们。我认为最好的方法是使用DELETE子查询,但我所做的一切似乎都不起作用。
我查找重复项的查询是:
SELECT DIVISION, FIPS_COUNTY_CODE, LAST, SUFFIX, FIRST, TITLE, BIRTHDATE, count(*)
FROM [work]
GROUP BY DIVISION, FIPS_COUNTY_CODE, LAST, SUFFIX, FIRST, TITLE, BIRTHDATE
HAVING count(*) > 1;
还有更多字段和主键。我尝试的任何语法似乎都没有做我想要的。我怎么能做到这一点?
答案 0 :(得分:0)
最好是在与Access不同的数据库上尝试此操作,您将在此答案中看到原因。但是你问过Access,所以这里有:
所以我们有这个表,其中包含了Dent先生和McMillan女士两次:
CREATE TABLE work (
division INT
, fips_county_code VARCHAR(3)
, last VARCHAR(10)
, suffix VARCHAR(3)
, first VARCHAR(6)
, title VARCHAR(16)
, birthdate DATE
);
INSERT INTO work VALUES(1,'UK' ,'Dent' ,'','Arthur','Earthling' ,'1957-08-02');
INSERT INTO work VALUES(1,'UK' ,'Prefect' ,'','Ford' ,'HH Guide Scout' ,'1925-04-01');
INSERT INTO work VALUES(1,'N/A','Beeblebrox','','Zaphod','Galaxy President','1857-09-13');
INSERT INTO work VALUES(1,'UK' ,'McMillan' ,'','Tricia','Astrophysicist' ,'1959-09-29');
INSERT INTO work VALUES(1,'UK' ,'Dent' ,'','Arthur','Earthling' ,'1957-08-02');
INSERT INTO work VALUES(1,'UK' ,'McMillan' ,'','Tricia','Astrophysicist' ,'1959-09-29');
我想你不想删除Dent先生或McMillan女士的两件事,而是保留其中一份副本。
独立于数据库,您将无法仅删除两个相同行中的一个。 (奇怪的是,你应该有一个主键;你永远不会有两个相同的行和一个有效的主键。)
在更好的数据库中,您会:
ALTER TABLE work RENAME TO work_with_dups;
CREATE TABLE work AS SELECT DISTINCT * FROM work_with_dups;
DROP TABLE work_with_dups;
但你仍然坚持使用Access。我建议你尝试尽可能多地模仿上述内容,但是你的可能性有限。
无法重命名,并且没有CREATE TABLE ... AS SELECT可能。因此,让我们创建一个与第一个结构相同的新表,并用所有work
表填充它:
CREATE TABLE work_with_dups(
division INT
, fips_county_code VARCHAR(3)
, last VARCHAR(10)
, suffix VARCHAR(3)
, first VARCHAR(6)
, title VARCHAR(16)
, birthdate DATE
);
INSERT INTO work_with_dups SELECT * FROM work;
现在,我们清理原始表......
DELETE FROM work;
我们用以前保存的work_with_dups
:
INSERT INTO work SELECT DISTINCT * FROM work_with_dups;
最后我们清理混乱:
DROP TABLE work_with_dups;
笨拙,但它有效......
Marco the Sane