初めて自分の家と他人の家が違う、と意識した時

Access2007で、削除クエリを作成しようとしています。
この削除クエリでは、AtblとBtblのテーブルから該当のレコードを削除したいのです。

Atbl           Btbl
発注No. フラグ        発注No.
 10   1          10
                10
                10
 20   0          20

といったように、Atbl.発注No.1つに対して、Btblは複数レコードあります。
これを、Atbl.フラグ=1 の条件の発注No.に該当するA,Btblのレコードを削除したいのです。

よろしくお願いします。
 

A 回答 (3件)

No.2、DexMachinaです。



> どうして削除されないのかわかりません。

私の場合、ヘルプを頼りにトライ&エラーでの経験則で覚えてきたので、
この件についての原理・理論的な説明はできないのですが(汗)、
とりあえず対処法について、説明します。
(一対多のリレーションシップが設定された複数テーブルからクエリを作成
 した場合、多側の削除は可能ですが、一側は削除不可のようです:
 No.1の補足欄で「ちなみに」として触れられている例が該当)


> これを踏まえて、上記の手順を確認しながらクエリを作成してみました

とのことから、リレーションシップの設定で、「参照整合性」と「連鎖削除」
の設定は済んでいるものと思います。
でしたら、「伝票ヘダー」テーブルだけを元にした削除クエリを作成すれば、
『連鎖削除』の設定により、「伝票明細」の該当レコード(=「伝票ヘダー」
で削除されたのと同じ「発注番号」を持つレコード)も同時に削除されます。

SQL文:
Delete 伝票ヘダー.* From 伝票ヘダー Where (伝票ヘダー.出力フラグ = 1);
    • good
    • 0
この回答へのお礼

DexMachinaさん、こんにちわ。

>SQL文:
>Delete 伝票ヘダー.* From 伝票ヘダー Where (伝票ヘダー.出力フラグ = 1);
だけで両方のtbl削除ができました。

リレーションシップの設定で、「参照整合性」と「連鎖削除」の設定がされていれば、このSQL文で削除されるのですね。

おかげさまですっきりしました。
また、すごく勉強になりました。
丁寧な回答もしていただいて本当にありがとうございました。

また、よろしくお願いします。

お礼日時:2009/09/16 18:26

> 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療法の該当レコードを削除したいのです。

どこがおかしいのでしょうか。
知恵をお貸しください。

よろしくお願いします。

補足日時:2009/09/14 21:15
    • good
    • 0

Atblの発注Noが主キーとなっている必要があると思いますが、


なっていますか?

この回答への補足

asfdさん、ありがとうございます。

今は主キーとはなっていないです。

補足日時:2009/09/11 18:27
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


おすすめ情報