Microsoft Access 掲示板

DoCmd.RunSQL でレコードを全部削除するとき / 2

3 コメント
views
4 フォロー
2

DELETEの後ろに*があったりなかったり

Access に限って言えば、参照されているテーブルが 1 つのみである場合については * を省略しても構いません。

例えば、1 対 1 または多対 1 の関係にある 2 つのテーブルを内部結合し、右テーブルのうち、ある条件に該当するレコードを抽出した上、左テーブルのレコードのみを削除する(右テーブルのレコードは削除しない)ような場合は、「削除対象となるレコードを含むテーブル」の指定が必要となります。

DELETE [TABLE_B].* 
FROM [TABLE_B] 
INNER JOIN [TABLE_A] 
ON [TABLE_B].[A_ID] = [TABLE_A].[A_ID] 
WHERE [TABLE_A].[A_NAME] Like "*OUT*";

テーブル名の後ろに;があったりなかったり

一般的な SQL の構文規則において、 ; は「複数のステートメントで構成されているクエリ( SQL Server でいうところのストアドプロシージャ等)内の個々のステートメントを区切る終端記号」として用いられます。

DELETE FROM [TABLE_B] WHERE [TABLE_B].[A_ID] = 2;
DELETE FROM [TABLE_A] WHERE [TABLE_A].[A_ID] = 2;

クエリ内で呼び出されるステートメントが 1 つのみである場合は ; を省略しても構いません。

ただ Access に関しては「 1 つのクエリにおいて呼び出せる命令は 1 つのみである」という仕様となっているため、上記のような複数のステートメントで構成されたクエリを作成、実行することは出来ません。
したがって、事実上はほとんどのケースにおいて ; を省略してもしなくても正常に実行されます。
唯一の例外は、PARAMETERS 句を記述してクエリパラメータを明示的に定義する場合です。

PARAMETERS [名前の条件] TEXT(255), [日時の条件] DATETIME;
DELETE FROM [TABLE_A]
WHERE [TABLE_A].[A_NAME] = [名前の条件]
  AND [TABLE_A].[A_DATE] <= [日時の条件];

上記のようなパラメータクエリの場合、PARAMETERS 句と DELETE 文を ; で区切らなければ構文エラーが発生します。

つまり * にしろ ; にしろ「省略してもよいケース」と「省略してはいけないケース」があるということです。

通報 ...