Как удалить в MS Access при использовании JOIN?
Я пытаюсь использовать предложение DELETE
в MS Access и имею проблему, также используя предложение JOIN
. Я заметил, что это может быть достигнуто с помощью ключевого слова DISTINCTROW
.
Например, следующий оператор SQL не позволяет удалить:
DELETE Table1.*
FROM Table1 INNER JOIN Table2 ON Table1.Name=Table2.Name;
Однако это утверждение делает:
DELETE DISTINCTROW Table1.*
FROM Table1 INNER JOIN Table2 ON Table1.Name=Table2.Name;
- Почему
DELETE
работает при использовании ключевого слова DISTINCTROW
?
- В частности, что требуется в двигателе JET для этого?
Ответы
Ответ 1
Delete Table1.*
From Table1
Where Exists( Select 1 From Table2 Where Table2.Name = Table1.Name ) = True
Чтобы расширить мой ответ, официальная спецификация SQL не предусматривает использование Joins в запросах действий специально потому, что может создавать неоднозначные результаты. Таким образом, лучше (и Access намного счастливее), если вы можете избежать использования Joins в действительных запросах, подобных мне. Причина, по которой Access хочет DISTINCTROW, состоит в том, что, вероятно, соединение между двумя таблицами создало бы дубликаты строк таблицы1 (т.е. В таблице 2 есть несколько связанных строк), и таким образом Access становится путаным. Я также обнаружил, что если вы пытаетесь использовать Join, а первичный ключ не существует, Access будет отключен. В общем, лучше избегать соединения в запросе действия, если вы можете.
Ответ 2
Одна проблема, о которой нужно знать: это НЕ работает с псевдонимами таблицы/запроса!
DELETE a.*
from tblA as A
where exists (select 1 from tblB as B where a.id=b.id)
Удаляет ВСЕ записи в tblA! Я попробовал это, используя псевдоним для tblA и tblB отдельно - тот же результат (Access 2010).
Случается также с SELECT (который я часто использую перед удалением)...
Ответ 3
DELETE a.*
FROM tblA AS A
WHERE EXISTS (SELECT 1 FROM tblB AS B WHERE a.id=b.id)
попробуйте это
DELETE tblA
FROM tblB
WHERE EXISTS (SELECT * FROM tblA AS A,tblB AS B WHERE A.id=B.id)