sk
2024/06/06 (木) 11:28:06
0454b@42a90
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 文を ; で区切らなければ構文エラーが発生します。
つまり * にしろ ; にしろ「省略してもよいケース」と「省略してはいけないケース」があるということです。
通報 ...