2017-01-10 8 views
0

У меня есть запрос в Access, который находит дубликаты записей. Я хочу удалить их. Я предполагаю, что лучший способ сделать это - с подзапросом DELETE, но я ничего не работаю.Как удалить из подзапроса дубликатов в Access?

Мой запрос для поиска дубликатов является:

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

Что вы пробовали до сих пор, и какие ошибки вы получили? Кроме того, было бы намного легче, если бы мы знали, как выглядела таблица, и если есть какие-либо FKC, о которых нужно знать и т. Д. –

+2

планируете ли вы удалить все возвращенные записи или вы хотите оставить один из двух дубликатов? – Stephen

+0

@LudvigRydahl Я попытался создать подзапрос DELETE. Поэтому у меня его больше нет, потому что это не сработало. Это просто удалялось по результатам databasename (subquery). – rohanharrison

ответ

0

Лучше всего попробовать это в другой базе данных, чем Access, и вы увидите в этом ответе почему. Но вы просили доступа, так что здесь идет:

Таким образом, мы имеем эту таблицу, которая содержит мистер Дент и г-жу Макмиллан дважды:

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 Дент или г-жа Макмиллан, но сохраните одну из копий.

Независимо от базы данных, вы не сможете просто удалить только одну из двух одинаковых строк. (странно, что у вас должен быть первичный ключ, хотя у вас никогда не будет двух одинаковых строк с рабочим первичным ключом).

В лучшей базе данных, вы бы:

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 здравомыслящий

+0

Ничего себе. Это безумие, но я вижу, что он работает ... У меня нет большой выбор, кроме как использовать Access к сожалению. – rohanharrison

 Смежные вопросы

  • Нет связанных вопросов^_^