Подтвердить что ты не робот

Как удалить в 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 для этого?
4b9b3361

Ответ 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)