• ベストアンサー

【Access2000】テーブルを検索条件にした削除クエリ

テーブル1 ID 名前 1  さとう 2  たかはし 3  こんどう 4  やまだ 5  いしかわ テーブル2 ID 2 4 5 上記、データを使用して、「テーブル2に登録されているIDが同じレコードを、テーブル1から削除するためのクエリ」を作成することは出来ますでしょうか? 結果として以下のようになることが希望です。 テーブル1 ID 名前 1  さとう 3  こんどう 削除クエリを作成して、条件で"ID=2"とすれば"2 たかはし"はもちろん削除されます。 しかし、条件を"like [テーブル2]![ID]"としても何も削除されません。 このような処理は可能でしょうか? 可能であればSQLを記述せずに実現させたいのですが可能でしょうか? (SQLは未熟者でして。。。) よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.4

No.3です。 > 以下のような場合も同じ方法で可能なのでしょうか? No.3での回答と同様の方法で対応可能です。 具体的には・・・ 1)「名字」と「出身地」の組み合わせを主キーに設定  (テーブル2のデザインビューで、左端をクリック&ドラッグして「名字」と「出身地」を   同時に反転表示させ、ツールバーの「主キー」ボタン(黄色の鍵マーク)をクリック) 2)前回回答の「1)」~「6)」を実行 3)『テーブル1』の「名字」を『テーブル2』の「名字」にドラッグ&ドロップ 4)『テーブル1』の「出身地」を『テーブル2』の「出身地」にドラッグ&ドロップ  *前回の「7)」と同様、テーブル追加したときに「-」で結合済みなら「3)」「4)」は不要 5)画面上半分の『テーブル1』の「*」を、画面下半分の「フィールド:」にドラッグ&ドロップ 6)前回回答の「9)」~「10)」を実行 以上の操作で作成したSQL文は以下のようになります; DELETE テーブル1.* FROM テーブル1 INNER JOIN テーブル2 ON (テーブル1.出身地 = テーブル2.出身地) AND (テーブル1.名字 = テーブル2.名字); 今回の場合も、テーブル2に主キーを設定することが肝になります。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.3

「SQL文はちょっと・・・」とのことですので、クエリの作成法ということで・・・ まず、テーブル2をデザインビューで開いて、「ID」を主キーに設定して下さい。 (でないと、削除クエリを実行しようとしたときに、削除不可エラーとなります) その上で・・・ 1)データベースウィンドウ左端の『オブジェクト』で「クエリ」を選択 2)『新規作成(N)』をクリック 3)『クエリの新規作成』ダイアログで「デザインビュー」をダブルクリック 4)『テーブルの表示』ダイアログで「テーブル1」をダブルクリック 5)同ダイアログで「テーブル2」をダブルクリック 6)同ダイアログの『閉じる(C)』ボタンをクリック 7)(操作順の違いなどにより、画面上半分の領域で『テーブル1』の  「ID」と『テーブル2』の「ID」の間に「-」での結合がない場合)  『テーブル1』の「ID」を『テーブル2』の「ID」のところへドラッグ&ドロップ 8)同領域の『テーブル1』の「*」を、画面下半分の領域の「フィールド:」  にドラッグ&ドロップ 9)メニューバーで「クエリ(Q)」→「削除(D)」を選択 10)名前をつけてクエリを保存 ・・・以上です。 一応、参考までに上記クエリに相当するSQL文を添付すると、 DELETE テーブル1.* FROM テーブル1 INNER JOIN テーブル2 ON テーブル1.ID = テーブル2.ID; になります。 本当は、No.1の方の回答通りにすれば、テーブル2への主キー設定は 不要になる(そしてそのSQL文も簡単にクエリに変換できる)のですが、 あまりでしゃばるのも何なので・・・ということでご了承下さい。 ・・・って、手があくのを待って回答文を完成させている間に、No.2の方の 回答が・・・ ・・・まあ、「主キー設定」のことがあるので、すみませんが今回はそのまま 回答させていただきます。

sarugetu
質問者

補足

とても丁寧な回答ありがとうございます。 方法はいろいろあるのですね。 まだまだ奥が深いです。。。 ちなみに、回答No.1で補足したケースも対応可能なのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • tkun62
  • ベストアンサー率23% (37/159)
回答No.2

クエリの新規作成でテーブル1テーブル2を追加して 両方のID同士を接続後に消したいテーブルのフィールド*を ダブルクリックで可能と思います。

sarugetu
質問者

補足

回答ありがとうございます。 意外と簡単に実現できるものなのですね。 なぜこれで実現できるかはまだ理解できていませんが。。。 ちなみに、回答No.1で補足したケースも対応可能なのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • arnk
  • ベストアンサー率20% (3/15)
回答No.1

delete from テーブル1 where ID in ( select ID from テーブル2 ) でどうでしょうか

sarugetu
質問者

補足

なんとかSQLを記述してみたらうまくいきました! ありがとうございます。 ちなみに以下のような場合も同じ方法で可能なのでしょうか? テーブル1 名字 名前 出身地 さとう たかし 北海道 さとう まさし 秋田 きむら まさお 沖縄 おがわ かずお 東京 テーブル2 名字 出身地 さとう 北海道 きむら 沖縄 おがわ 福岡 これで、テーブル2の名字と出身地が同じであれば、テーブル1からレコードを消す、というようなものです。 このケースでは望まれる結果は以下のようになります。 テーブル1 名字 名前 出身地 さとう まさし 秋田 おがわ かずお 東京 よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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のレコードを削除したいのです。 よろしくお願いします。  

  • Access 削除クエリが重い

    お世話になります。 環境:Access2003     SQL Server 2008 R2 Express 先日、Accessのローカルにあるテーブルが20万レコードを超えた為、SQLサーバーへ移行しました。 しかし、Accessより削除クエリにて(フォーム上に設置した削除ボタンにて)当該テーブルのレコードを削除しようとすると、4分ほどかかりました。 なお、ローカルにあったときは上記操作をしても2、3秒程度で削除完了してました。 PCのスペックやテーブルのレコード数によるかとは思うのですが、ローカルテーブルとSQLテーブルでこんなに時間が違うものなのでしょうか。 また、回避策や何か設定すれば早くなるなどございましたら、ご教授頂けたらと思います。 宜しくお願い致します。

  • 他テーブルの同フィールドを結合する方法

    お世話になります。 Access2000で教えてください。 下記のようなテーブル1,2があります。 このテーブル1,2をひっつけて、 テーブル3を作成したいのですが、 どのように作成すればよいでしょうか? 可能でしたら、クエリで、 説明しやすいのでしたら、SQLでも 結構ですので宜しくお願い致します。 ----------------------------------- テーブル1 名前  1着数 やまだ 3 ----------------------------------- テーブル2 名前 2着数 やまだ 1 ----------------------------------- テーブル3 名前 1,2着数 やまだ 4

  • Access 2007で、テーブルからレコードを削除するクエリを作りた

    Access 2007で、テーブルからレコードを削除するクエリを作りたい。 具体的には、テーブルAのフィールドF1とテーブルBのフィールドF2があるとします。このとき、テーブルA中の各レコード(仮にXとします)であって、そのF1の値と同じ値をF2に持つレコードがテーブルBに含まれている場合は、(テーブルAから)そのレコードXを削除するという処理をしたいのです。ややこしいと思いますが、これをクエリやマクロで作ることはできるでしょうか? 私はVBAを知らない初心者です。上の処理も文章で書くと理解してもらえるかどうか不安ですが、だれか助けて下さい。

  • テーブル削除クエリ

    テーブル作成クエリはあるけどテーブル削除クエリはないのでしょうか? ADOXで削除するしかないですか?

  • Access97の削除クエリーについて

    初歩的なことで もうしわけありません。チンプンカンプンです。 身の回りにある本で、削除クエリーすら捜すことが出来ませんでした。 教えてください。 宜しくお願いします。 Aテーブルから 以下の条件のレコードを削除したいです!! ※条件※ (Aテーブル.名前 = Bテーブル.名前 ) かつ、(Aテーブル.内訳 = NULL) レイアウト Aテーブル: 処理日付 → テキスト 8文字 名前 → テキスト 5文字 内訳 → テキスト 8文字 金額 → 通貨型 (テーブル数 60) などなど・・・ Bテーブル: 名前 → テキスト 5文字 で、こんな感じで 記述しました。 DELETE Aテーブル.内訳, Aテーブル.* FROM W_MB INNER JOIN Bテーブル ON Aテーブル.名前 = Bテーブル.名前 WHERE (((Aテーブル.内訳) Is Null)); すると こんなメッセージが→『更新可能なクエリーでなければなりません。』 な・なぜなのでしょう・・・

  • 2つのテーブル間でのあいまい検索について

    はじめまして、SQLを勉強はじめたばかりのものです。 現在2つのテーブル間であいまい検索を行いたいのです。 テーブル1 id 配列 1 ABCDEFG 2 HIJKLMN 3 OPQRSTU 4 VWXYZ12 テーブル2 id 配列 1 CDE 2 BCDEF 3 OPQR 4 HIJKLM 5 DEFG 6 VWXY 上記のような2つのテーブルで、実際は数万行あります。 LIKE演算子でテーブル2の配列情報を順次テーブル1に あてはめる方法がわかりません。 結果としては id  配列    id 配列 1 ABCDEFG   1 CDE 1 ABCDEFG   1 BCDEF . . . のようなテーブルが作成されることを期待しています。 SQLクエリだけでは作成は無理でしょうか? 上級者の皆様ご助言お願いします。

  • アクセスの追加クエリについて

    二つのテーブル間(AとB)を追加クエリを使い AからレコードをBに追加することは出来たんですが、 逆にBからAにレコードを追加しようと選択クエリを追加クエリに変更しようとしたんですが、ウィザードの追加先テーブル名にAのテーブル名が表れないですがその理由が全く分からないので分かる方教えていただけませんか? AとBのレコード内のフィールドは同じです。 AからBにレコードを移行する処理としてマクロを使いアクションとして ・クエリを開く(これは追加クエリです) ・SQLの実行(上と同じクエリを削除クエリに変更し、そのSQL文をSOLステートメントに貼り付けました) 上の処理は問題なく出来たので逆のBからAへレコード移行処理のマクロを作ろうとしたのですが、追加クエリの追加先テーブルにテーブルAの名前が出てこないので困っています。こういったAからB。BからAという処理は追加クエリで出来ないのでしょうか?

  • SQLで二つのテーブルを統合したい

    お世話になります。 Access2000のSQLで質問させて下さい。 下記のAとBのテーブルがある状態で、二つを統合した Cを生成したいのですが、どのようにSQLを作成したらよいでしょうか? お手数でもうしわけございませんが、SQL文で回答頂ければ助かります。 --テーブルA--- ID 名前 11 やまだ 12 さかもと --テーブルB--- ID 名前 25 きのした 26 つちや --C-- ID 名前 11 やまだ 12 さかもと 25 きのした 26 つちや

  • ある条件を含まないというクエリがうまく書けません。

    ある条件を含まないというクエリがうまく書けません。 test_table ID,name ----------- 1,aaa 2,bbb 3,ccc 4,ddd 5,eee test_table2 ID,value ----------- 1,100 1,200 1,300 1,400 2,100 2,200 3,900 3,800 4,400 4,500 4,600 5,100 今まで下記クエリのように、test_tableのIDとtest_table2のIDでジョインして、 test_table2のvalueに"200"を含んでいるtest_tableのレコードを取得していました。 SELECT DISTINCT test_table.* LEFT JOIN test_table2 ON test_table.ID = test_table2.ID WHERE test_table2.value = 200; (test_tableのID:1と2のレコードが返ってきます。) これを、test_table2のvalueに"200"を含まないものを返すようにしたいのです。 (test_tableのID:3と4と5のレコードを返したい) 下記クエリを作ってみましたが、ID:1と2も返ってきてしまいます。 ID:1のvalueの"100","300","400"、ID:2のvalueの"100"に条件が合ってしまうようです。。 SELECT DISTINCT test_table.* LEFT JOIN test_table2 ON test_table.ID = test_table2.ID WHERE test_table2.value != 200; なにが良い方法があればご教授下さい。

    • ベストアンサー
    • MySQL

専門家に質問してみよう