УДАЛИТЬ дубликаты с подзапросом из 2 таблиц в MS Access - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть две таблицы с одинаковой структурой, которые могут иметь дублированные записи. Я хочу определить, какие из таблиц 2 уже существуют в таблице 1, и удалить их из таблицы 2. Следующий SELECT возвращает дублированные записи, которые я хочу удалить. Ни одна из этих таблиц не имеет первичного ключа, поэтому мне нужно сделать несколько «ON» для идентификации уникальных записей.

        SELECT V.*
        FROM table2 AS V
        INNER JOIN table1 AS N
        ON V.column1 = N.column1 AND V.column2 = N.column2 AND V.column3= N.column3;

Затем я вставляю это как подзапрос для DELETE:

        DELETE FROM table2
        WHERE table2.column1 IN
        (SELECT V.*
        FROM table2 AS V
        INNER JOIN table1 AS N
        ON V.column1 = N.column1 AND V.column2 = N.column2 AND V.column3= N.column3);

При выполнении этого запроса я получаю следующую ошибку:

Вы написали запрос, который может возвращать более одного поля без использования зарезервированного слова EXISTS в предложении FROM основного запроса. Исправьте инструкцию SELECT подзапроса, чтобы запросить одно поле.

Я также пробовал этот способ, но он удаляет все записи из таблицы 2, а не только результат подзапрос:

        DELETE FROM table2
        WHERE EXISTS
        (SELECT V.*
        FROM table2 AS V
        INNER JOIN table1 AS N
        ON V.column1 = N.column1 AND V.column2 = N.column2 AND V.column3= N.column3);

Это первое решение, которое я придумал, но мне интересно, не будет ли проще сделать в MS Access вставку в таблицу1 всех записей из таблицы2, которые не сопоставьте, а затем удалите table2.

Будут оценены все предложения:)

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Я думаю, что вы просто пропускаете указанный столбец c в своем подзапросе.

Это должно работать лучше:

DELETE FROM table2
WHERE table2.column1 IN
(SELECT V.column1 
FROM table2 AS V
INNER JOIN table1 AS N
ON V.column1 = N.column1 AND V.column2 = N.column2 AND V.column3= N.column3);
1 голос
/ 11 февраля 2020

Прислушайтесь к сообщению об ошибке и попробуйте использовать существующее logi c:

DELETE
FROM table2 t2
WHERE EXISTS (SELECT 1 FROM table1 t1
              WHERE t1.column1 = t2.column1 AND
                    t1.column2 = t2.column2 AND
                    t1.column3 = t2.column3);

Проблема с вашей текущей попыткой существующего состоит в том, что запрос внутри предложения EXISTS всегда имеет результирующий набор и этот набор результатов не зависит от внешнего вызова удаления. Таким образом, все записи будут удалены.

...