Microsoft Access 掲示板

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

3 コメント
views
4 フォロー

 DoCmd.RunSQL でレコードを全部削除するときに正しい構文はどれなのでしょうか

DoCmd.RunSQL "DELETE* FROM テーブル名;"
DoCmd.RunSQL "DELETE* FROM テーブル名"
DoCmd.RunSQL "DELETE FROM テーブル名;"

DELETEの後ろに*があったりなかったり
テーブル名の後ろに;があったりなかったり
ネットを探ってもいろいろな情報があって迷ってしまいました。
(上記では、わかりやすいように全角で表示しています)

かーか
作成: 2024/06/05 (水) 16:04:00
最終更新: 2024/06/05 (水) 16:35:40
通報 ...
1
hiroton 2024/06/05 (水) 17:18:41 3a143@f966d

フィールド指定の「*
いらないです。たぶん、ACCESSの場合、クエリデザインでクエリを作成するときにフィールド出力が必要なのでしょう。(クエリ作成ツールの仕様)
その関係で自動整形で付与されたりします

DELETE ステートメント (Microsoft Access SQL)
「省略可能記述」なので、省略する/しないでどちらが正しいか?はありません。どちらも正しいです。これは一般的なSQLにおいても記述はないので、普段から記述しないで良いでしょう

構文終端の「;(セミコロン)」
技術資料が見つかりませんでした。現実的には省略可能です。これもACCESSにおいてはどちらが正しいというものでもないでしょう。これも、必要、不要、省略可能は様々なSQLの個性によるようです

ただし、システムによってはSQL構文を連続して記述したり、続けて何かの記述を許すようなモノもあります。そのような場合には、当然;が必要になります

ACCESSだけを扱っている場合は気にする必要はないが、SQL自体に興味がある場合は記述する癖をつけておいたほうが無難です

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 文を ; で区切らなければ構文エラーが発生します。

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

3
かーか 2024/06/09 (日) 21:26:07 c5886@34461

みなさま丁寧なご解説ありがとうございました。省略してうまくいく時と、そうでない時があり、少し困っていましたが、省略可能でもきちんと表現したいと思います。ありがとうございました。