如何从Access中的重复子查询中删除?

时间:2017-01-10 14:47:08

标签: sql ms-access subquery

我在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;

还有更多字段和主键。我尝试的任何语法似乎都没有做我想要的。我怎么能做到这一点?

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