【问题标题】:How can I delete from a duplicates subquery in Access?如何从 Access 中的重复子查询中删除?
【发布时间】:2017-01-10 14:47:08
【问题描述】:

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

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

【问题讨论】:

  • 到目前为止您尝试了哪些操作,遇到了哪些错误?此外,如果我们知道表格的外观以及是否有任何 FKC 需要注意等,那将会容易得多。
  • 您打算删除所有返回的记录,还是要保留每个重复集之一?
  • @LudvigRydahl 我试图创建一个 DELETE 子查询。所以我不再拥有它,因为它不起作用。它只是删除了数据库名称(子查询)结果。
  • @Stephen 我想删除我的选择返回的所有记录。

标签: sql ms-access subquery


【解决方案1】:

最好在与 Access 不同的数据库上尝试此操作,您将在此答案中看到原因。但是你问的是 Access,所以这里是:

所以我们有这张表,其中包含两次 Mister Dent 和 Ms 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');

我想您不想同时删除每个 Mr. Dent 或 Ms. 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;

笨拙,但它有效......

理智的马可

【讨论】:

  • 哇。这太疯狂了,但我可以看到它工作......我没有太多选择,只能使用 Access。
猜你喜欢
  • 1970-01-01
  • 2020-09-02
  • 2020-05-26
  • 2021-11-09
  • 1970-01-01
  • 2016-03-16
  • 1970-01-01
  • 2014-07-09
  • 2021-09-24
相关资源
最近更新 更多