削除クエリ

 テーブルからのレコードの削除は手作業で行うだけでなく、削除クエリというものを用いることによって条件に合致するレコードを一括削除することができます。

手順

f:id:accs2014:20181216230652p:plain:right:w500

 サンプルとなるテーブル、つまり削除の対象となるテーブルがこちらの「商品テーブル」です。
 このようなテーブルにおいて「販売終了日」列に値が存在する(つまりもう販売していない)レコードを削除するものとします。

f:id:accs2014:20181216230650p:plain:right:w550

 さて手順です。
 まずは普通に選択クエリを作成し、削除しようとするレコードの条件を設定します。
 ここでは「販売終了日」列の抽出条件に「Is Not Null」と設定します。

f:id:accs2014:20181216230647p:plain:right:w400

 念のためこのクエリをデータシートビューで見てみます。
 「販売終了日」列に値が存在する2つのレコードが選択されているのがわかります。
(※ただし、このようにすべての列を選択しておく必要はありません。この例では「販売終了日」列だけ選択、設定してもレコードの削除はできます。)

f:id:accs2014:20181216230645p:plain:right:w500

 次にデザインタブから「削除」というメニューを選択します。

f:id:accs2014:20181216230641p:plain:right:w600

 するとデザイングリッドに「レコードの削除」という行が現れます。値は「Where」となっていて、ほかに「From」を選択することもできますが、ここでは「Where」のままとしておきます(Fromの使用例は次の例で示します)。
 また、クエリを保存するとクエリのアイコンが変化します。

f:id:accs2014:20181216230734p:plain:right:w450

 さて、設定は終了しましたが、まだテーブルのレコードは削除されていません。
 削除するときは、メニューから「実行」をクリックします(クエリを開いていない状態で、左のナビゲーションウインドウのクエリのアイコンをダブルクリックするという方法もあります)。

f:id:accs2014:20181216230731p:plain:right:w450

 確認のメニューが出ますので「はい」とします。

f:id:accs2014:20181216230728p:plain:right:w500

 その後商品テーブルを開くと、確かに2つのレコードが削除されているのが分かります。

複数のテーブルを用いる例

f:id:accs2014:20181219235628p:plain:right:w450

 ちょっとした応用例として、複数のテーブルを用いた削除クエリを実行してみます。
 具体的には「売り上げのない商品(販売明細テーブルにキーが存在しない)のレコードを商品テーブルから削除する」ということをやってみます。Where条件を設定するテーブルとレコードを削除するテーブルが別、というところがポイントです。
 商品テーブルと売上明細テーブルの間で外部結合を設定し、デザイングリッドでは「商品テーブル.*」を選択し「レコードの削除」を「From」とします。さらに「売上明細テーブル.商品コード」を選択して、「レコードの削除」を「Where」とし、条件を「Is Null」とします。ちょっと難しいですけども不一致クエリを使ったことがある方はこのような設定に見覚えがあるかと思います。
 このように「レコードの削除」を「From」にすることにより削除の対象となるテーブルを指定できますが、このときフィールドは「商品テーブル.*」(つまり商品テーブルの全列)のようにアスタリスクを選択する必要があります。

f:id:accs2014:20181220001927p:plain:right:w600

 ちなみにデータシートビューです。
 売り上げが存在しない3つの商品のレコードの内容が確認できます。

f:id:accs2014:20181219235625p:plain:right:w450

 さて、あとは実行するだけに見えますが、実は複数のテーブルからなる削除クエリについては、プロパティの「固有のレコード」を「はい」にする必要があります。
 こうしておかないと実行時に「指定されたテーブルから削除できませんでした。」というエラーが出て失敗します;-o-)

f:id:accs2014:20181219235623p:plain:right:w450

 以上で設定は完了です。
 実行すると商品テーブルから3件のレコードが削除されます。

f:id:accs2014:20181219235620p:plain:right:w500

 実行後の商品テーブルです。
 たしかに先ほど見た3つのレコードが削除されています。

 複数のテーブルを用いた削除クエリはなかなか難解で、参照整合性を設定している場合はさらに連鎖削除の設定が必要となる場合もあります。誤った設定にしてしまうと取返しがつかないことにもなりかねませんので、十分な確認とバックアップの確保が欠かせません。

備考

 上記の商品テーブルの例がまさにそうですが、(販売が終了した等の理由で)必要が薄れたレコードであっても、売上集計には必要なので月末や年度末までは残しておきたい、という場合が考えらえます。削除対象となるレコードは随時増えていきますが、いざその時に手作業で削除するのも面倒なので、そうしたときに削除クエリは役に立ちます。手作業での削除と違って、必要なレコードを間違って削除してしまうミスを防げるのもメリットです。