1. ホーム
  2. sql

[解決済み] MS AccessでJOINの使用時に削除する方法は?

2022-02-19 02:42:09

質問内容

を使おうとしています。 DELETE 節を使用すると、問題が発生します。 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エンジンの中で何が起きていて、これを要求しているのでしょうか?

解決方法は?

Delete Table1.*
From Table1
Where Exists( Select 1 From Table2 Where Table2.Name = Table1.Name ) = True

私の答えを発展させると、公式SQLの仕様では、アクションクエリでJoinを使用することを特に規定していません。なぜなら、曖昧な結果を生み出す可能性があるからです。したがって、今回のようなアクションクエリでJoinを使用しないようにできれば、よりよい(Accessもより満足する)のです。AccessがDISTINCTROWを必要とする理由は、2つのテーブル間のJoinがTable1の行の重複を作成する可能性があるためです(つまり、Table2には複数の関連行がある)、Accessは混乱するのです。また、Joinを使用する際にプライマリキーが存在しないとAccessは失敗します。一般的には、アクションクエリでJoinを使用するのは避けた方がよいでしょう。