- ベストアンサー
Access2007 削除クエリで複数テーブル削除
Access2007で、削除クエリを作成しようとしています。 この削除クエリでは、AtblとBtblのテーブルから該当のレコードを削除したいのです。 Atbl Btbl 発注No. フラグ 発注No. 10 1 10 10 10 20 0 20 といったように、Atbl.発注No.1つに対して、Btblは複数レコードあります。 これを、Atbl.フラグ=1 の条件の発注No.に該当するA,Btblのレコードを削除したいのです。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.2、DexMachinaです。 > どうして削除されないのかわかりません。 私の場合、ヘルプを頼りにトライ&エラーでの経験則で覚えてきたので、 この件についての原理・理論的な説明はできないのですが(汗)、 とりあえず対処法について、説明します。 (一対多のリレーションシップが設定された複数テーブルからクエリを作成 した場合、多側の削除は可能ですが、一側は削除不可のようです: No.1の補足欄で「ちなみに」として触れられている例が該当) > これを踏まえて、上記の手順を確認しながらクエリを作成してみました とのことから、リレーションシップの設定で、「参照整合性」と「連鎖削除」 の設定は済んでいるものと思います。 でしたら、「伝票ヘダー」テーブルだけを元にした削除クエリを作成すれば、 『連鎖削除』の設定により、「伝票明細」の該当レコード(=「伝票ヘダー」 で削除されたのと同じ「発注番号」を持つレコード)も同時に削除されます。 SQL文: Delete 伝票ヘダー.* From 伝票ヘダー Where (伝票ヘダー.出力フラグ = 1);
その他の回答 (2)
- DexMachina
- ベストアンサー率73% (1287/1744)
> Atbl.発注No.1つに対して、Btblは複数レコードあります。 Atblの発注No.は、重複するものはないと考えてよろしいでしょうか。 そうであれば、「リレーションシップ」の設定を使用することで、1つの 削除クエリで対応できます。 そうではない場合は、Atbl用とBtbl用の削除クエリをそれぞれ作成 するしかありません。 以下、前者(=Atblの発注No.は重複なし)での対応法を説明します。 (なお、1~3の操作は、対象フィールドが主キーの場合は不要です: No.1の補足では「主キーではない」とのことなので、今回は必要) 1)Atblをデザインビューで開き、『発注No.』にカーソルを移動 2)画面下方の領域の『標準』タブ内にある『インデックス』の設定値を 「はい (重複なし)」に設定 3)Atblを保存して閉じる 4)『データベース ツール』リボンを選択し、『表示/非表示』内にある 『リレーションシップ』ボタンをクリック 5)『デザイン』リボンの『リレーションシップ』内にある『テーブルの表示』 ボタンをクリック (または、リレーションシップ画面(画面右下のグレーの領域)を 右クリックして「テーブルの表示(T)」を選択しても可) 6)『テーブルの表示』ダイアログが開くので、AtblとBtblをそれぞれ追加 7)Atblの発注No.を、Btblの発注No.の位置にドラッグ&ドロップ 8)『リレーションシップ』ダイアログが開くので、ダイアログ下方の 『リレーションシップの種類』が「一対多」になっているのを確認し、 『参照整合性(E)』のチェックをオンにする ※「1~3」の操作をしていない(もしくは主キーではない)場合は 「多対多」と表示され、参照整合性のチェックはオンにできません。 9)『レコードの連鎖更新(D)』が使用可能になるので、そのチェックも オンにする 10)『作成(C)』ボタンをクリックして『リレーションシップ』ダイアログを閉じる 11)『リレーションシップ』画面で、Atblの発注NoとBtblの発注Noの間に 結合線が表示され、Atbl側に「1」、Btbl側に「∞」が表示されている ことを確認し、『リレーションシップ』画面を閉じる ・・・以上です。 これで、Atblのレコードを削除クエリなどで削除すると、削除対象と同じ 発注NoをもつBtblの全てのレコードが削除されるようになります。
補足
DexMachinaさん、いつもありがとうございます。 >Atblの発注No.は、重複するものはないと考えてよろしいでしょうか 重複はありません。 前に、Atblの発注No.は主キーかとあったのですが、よく見ると主キーになっていました。 これを踏まえて、上記の手順を確認しながらクエリを作成してみましたが、”指定されたテーブルから削除できません”とエラーになります。 クエリのSQLビューは下記のとおり DELETE 伝票ヘダー.出力フラグ, 伝票明細.*, 伝票ヘダー.* FROM 伝票ヘダー INNER JOIN 伝票明細 ON 伝票ヘダー.発注番号=伝票明細.発注番号 WHERE (((伝票ヘダー.出力フラグ)=1)); どうして削除されないのかわかりません。 ちなみに DELETE 伝票ヘダー.出力フラグ, 伝票明細.* FROM 伝票ヘダー INNER JOIN 伝票明細 ON 伝票ヘダー.発注番号=伝票明細.発注番号 WHERE (((伝票ヘダー.出力フラグ)=1)); とすると、 伝票明細tblは該当レコードが削除されていますが、伝票ヘダーtblは 削除されていません。 期待する結果は、伝票ヘダー&伝票明細tbl療法の該当レコードを削除したいのです。 どこがおかしいのでしょうか。 知恵をお貸しください。 よろしくお願いします。
- asfd
- ベストアンサー率21% (25/117)
Atblの発注Noが主キーとなっている必要があると思いますが、 なっていますか?
補足
asfdさん、ありがとうございます。 今は主キーとはなっていないです。
お礼
DexMachinaさん、こんにちわ。 >SQL文: >Delete 伝票ヘダー.* From 伝票ヘダー Where (伝票ヘダー.出力フラグ = 1); だけで両方のtbl削除ができました。 リレーションシップの設定で、「参照整合性」と「連鎖削除」の設定がされていれば、このSQL文で削除されるのですね。 おかげさまですっきりしました。 また、すごく勉強になりました。 丁寧な回答もしていただいて本当にありがとうございました。 また、よろしくお願いします。