Как удалить в MS Access при использовании JOIN? - PullRequest
24 голосов
/ 07 апреля 2011

Я пытаюсь использовать предложение 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, чтобы требовать этого?

Ответы [ 3 ]

24 голосов
/ 07 апреля 2011
Delete Table1.*
From Table1
Where Exists( Select 1 From Table2 Where Table2.Name = Table1.Name ) = True

Чтобы расширить мой ответ, официальная спецификация SQL не предусматривает использование соединений в запросах действий, поскольку это может привести к неоднозначным результатам. Таким образом, было бы лучше (и Access намного счастливее), если вы можете избежать использования объединений в запросах действий, как я здесь. Причина, по которой Access хочет DISTINCTROW, заключается в том, что соединение между двумя таблицами, вероятно, создаст дубликаты строк Table1 (т. Е. В Table2 есть несколько связанных строк), и, таким образом, Access запутается. Я также обнаружил, что если вы попытаетесь использовать Join, а первичный ключ не существует, Access будет заблокирован. В общем случае лучше избегать объединения в запросе действия, если можете.

3 голосов
/ 03 июня 2014

Одна проблема, о которой следует знать: это НЕ работает с псевдонимами таблицы / запроса!

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 (который я часто использую перед удалением) ...

0 голосов
/ 20 октября 2016
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)
...