• ベストアンサー

別テーブルの検索した結果が0件のデータのレコードを削除したい

SQL Server 2005 を使用しています。 別テーブルで検索した結果が0件の時、対応するレコードを削除したいのですが、SQLをどうかけば実現出来るかわかりません。 具体的には、テーブル Aとテーブル B があって、テーブル Aのキーが AA,AB,ACとします。 この時、テーブル Bにも AA,AB,ACという列があるとします。 この時に、テーブルBをAA,AB,ACでGROUP BYしてCOUNTをとった時にレコード数が0のキーのレコードを、テーブルAから削除したいのですが、この時SQLを一つで書きたいのです。 テーブル Aが明細、テーブル Bが名簿みたいな形で、名簿に存在しないレコードを削除するような感じです。 どういうSQLを書けばいいか少し悩んでいます。 AA,AB,ACは全て integer型です。 どなたかわかりましたら教えてください。

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

  • ベストアンサー
  • iyomante
  • ベストアンサー率60% (14/23)
回答No.1

あくまで一般論のSQLとしてですが、 テーブルAとテーブルBのキーが同一項目で 一方に存在しないレコードをもう一方で削除等するのなら DELETE FROM A WHERE NOT EXISTS ( select * from B where B.AA = A.AA and B.AB = A.AB and B.AC = A.AC );

takasebou
質問者

お礼

回答ありがとうございます。お礼が遅くなりましてすみません。 別の手段で実行してしまいましたが、今後の参考になります。

その他の回答 (2)

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.3

A. NO2 です。 失礼 Bテーブルを削除ではなく、Aテーブルを削除ですね。 訂正いたします。 下記 SQL が回答です。 ___________________________________________________________ DELETE A FROM A LEFT OUTER JOIN B ON A.AA = B.AA AND A.AB = B.AB AND A.AC = B.AC WHere B.AA IS NULL AND B.AB IS NULL AND B.AC IS NULL

takasebou
質問者

お礼

ありがとうございます。お礼が遅くなりましてすみません。 結局、別の方法で無理矢理実行してしまいましたが、今後の参考にします。

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.2

DELETE B FROM A LEFT OUTER JOIN B ON A.AA = B.AA AND A.AB = B.AB AND A.AC = B.AC WHere B.AA IS NULL AND B.AB IS NULL AND B.AC IS NULL ========================================================== 上記で大丈夫だと思います。 Exsits は毎回レコード探すので 処理スピードがいまいちです。 上記を試してみてください。 上記のSQLは AとBのテーブルをLEFT 結合したときAのテーブルのレコードだけが存在する場合 Bのテーブルの各値が NULL になります。 それを抽出して削除すればOKだと思います。 以上

関連するQ&A

  • SELECT/別テーブルのレコード数も取得したい

    ■環境 ・MySQL ■前提 ・テーブルA … idカラム ・テーブルB … A_idカラム ■やりたいこと ・テーブルAデータを取得する際、テーブルAレコードに応じて、テーブルB「A_idカラム」の数(レコード数)も取得したい ■取得イメージ例 ・テーブルA「全カラム」、「count」カラム ※「count」カラム … テーブルBにある「A_idカラム」の数 ■知りたいこと ・どこにも存在しないこの「count」カラムはどうやって作成したら良いでしょうか? ・全体のSQL文

    • ベストアンサー
    • MySQL
  • 複数のテーブルの レコード件数所得

    sql初心者です。 php sql4.1を使って テーブルA・テーブルBの総レコード件数を所得がうまくできません。 テーブルAの◇◇が○○の含むレコード件数を所得は SELECT count(*) FROM テーブルA WHERE ◇◇ LIKE ○○ でできました。 テーブルA・テーブルBの◇◇が○○の含むレコード件数を所得はどうすればいいのでしょうか? よろしくお願いいたします.

    • ベストアンサー
    • MySQL
  • SQLについて教えてください

    お世話になっております。 以下、取得したい内容です。 この内容に対して、どのようにSQLを書けばよいか良いか教えて頂きたいです。 (1)DBの全テーブルに対して特定のカラムを取得したい。(カラム名はA,Bとする) (2)取得したカラム.Aに格納されている各値に対して、カラム.Bの各レコードの項目には何の値が格納されているか知りたい。 DBはオラクルですが、オラクルでしか使えないSQL構文はつかないようにしたいです。 自分で考えたSQLは、 SELECT A,B FROM * GROUP BY A,B ですが、そもそも全テーブルを指定する際に使用するのが、「*」では正しくないような気もします。 説明がつたなくて申し訳ございません。 宜しくお願い致します。 ・テーブルイメージ テーブル.test1 +--------+------+ | No | A | B | +--------+------+ | 01 |AA| 1 | | 02 |AA| 1 | | 03 |AB| 2 | | 04 |AB| 2 | | 05 |AC| 3 | | 06 |AC| 3 | | 07 |AC| 3 | +--------+------+ テーブル.test2 +--------+------+ | No | A | B | +--------+------+ | 01 |AA| 1 | | 02 |AA| 1 | | 03 |AB| 2 | | 04 |AB| 2 | | 05 |AC| 1 | | 06 |AC| 3 | | 07 |AC| 3 | +--------+------+ テーブル.test3 +--------+------+ | No | A | B | +--------+------+ | 01 |AA| 3 | | 02 |AA| 1 | | 03 |AC| 2 | | 04 |AC| 3 | +--------+------+

  • SQLiteで最も古いレコードのみの削除

    AndoroidでDBを使うのですが、考える動作のSQL文が作成できません。 テーブルTESTは以下のカラムを持ちます  ・ID - primary key not null  ・VALUE - not null テーブルTESTは最大で10件のレコードを保持します、11件目のレコードが発生したら 最も古い1件目のレコードを削除してから、11件目のデータを新しい10件目のデータとして テーブルに保存します。 そのために「最も古いレコード1件のみを削除する」というSQLを作成したいのですが、 考えたSQL文が正しくないと怒られてしまいます。 delete from TEST as A, (select * from TEST LIMIT 1)as B where A.ID=B.ID; この動作を1つのSQL文で行うのは不可能なのでしょうか?

  • 削除するレコードを含んだテーブルを指定してください

    DELETE テーブルA.店名, メインテーブル.店名 FROM メインテーブル RIGHT JOIN テーブルA ON メインテーブル.店名 = テーブルA.店名 WHERE (((メインテーブル.店名) Is Null)); というSQL分で、メインテーブルにないけど、テーブルAにはある、店名を削除しようとしたら、 「削除するレコードを含んだテーブルを指定してください。」 となってしまいます。 実際は30レコードくらいあります。 なぜ、削除できないのでしょうか?

  • 2つのテーブルに共通するレコードを削除したい

    2つのテーブルがあり、両方にID番号フィールドが存在しています。 Aテーブルは元のデータ Bテーブルは削除したいレコードのID番号 という構成になっているとき、 AテーブルとBテーブルの共通するレコードを削除するにはどうすればよいでしょうか。 ものすごく単純な質問で申し訳ないのですが...宜しくお願いします

  • すべてのテーブルのすべてのレコードを削除する方法

    データベースを扱うプログラムに対してユニットテストを行いたいと思っています。 それぞれのテストが終了するごとにすべてのテーブル内のすべてのレコードを削除したいのですが、 delete from table_a; delete from table_b; delete from table_c; ... のように書くと、外部キー制約に引っかかってしまい削除できないことがあります。 短いSQL文で複数のテーブル内のレコードをすべて削除する方法はないのでしょうか? よろしくお願いします。 ちなみに、私が現在使っているDBMSはPostgreSQL 8.1です。

  • 異なるテーブルのレコード削除

    オラクル初心者です。宜しくお願いします。 AAA、BBB、CCCというテーブルがあると仮定します。 画面から入力された値(ddd)をキーとして、CCCテーブルから該当するレコードをセレクト文で引っ張り、eeeという値を抜き出したとします。 そのeeeという値をキーにAAA、BBBテーブルのレコードを削除するにはどういうSQLを発行すればよろしいでしょうか? "delete from AAA, BBB where eee = (select eee from CCC where fff = ddd);" では駄目でした。 質問が下手でわかりにくいかもしれませんが、どうかご教授お願いします。

  • 別テーブルの抽出方法について

    初心者質問で恐縮なのですが、 テーブルAを正規化してテーブルBを作成したとします。 さらにテーブルBを正規化し、テーブルCを作成します。 そこで、そのテーブルA、B、Cからあるレコード1つ抽出するにはどのようなSQL文を書けば抽出できますでしょうか。 また、テーブルに外部キー制約などを用いてリレーショナル関係を築いた場合、そのメリットは更新、削除等で他のレコードと間違えないことであるということの他になにかありますでしょうか? ご存知の方、宜しくお願いします。

  • レコード削除でのテーブル修正

    初めて、データベースを作成するのですが、 基本的な部分でつまずいています。 テーブルのレコード削除において、 そのテーブルの主キーを外部キーに使用している他のテーブルの修正に関して 教えて頂きたいのですが? 例えば、テーブルが2つ(Table-A、Table-B)あり、 フィールドとして、 Table-A (1)販売員コード(主キー) (2)名前      (3)年齢 Table-B (1)顧客コード(主キー)  (2)販売員コード(外部キー) (3)注文日  (4)商品コード(外部キー) があったとします。 この時、Table-Aの販売員コード 0015番が辞めたので、削除する場合、 1.通常、0015番は、永久欠番にするのでしょうか、それとも新しい販売員に  割り当てることもあるのでしょうか? 2.もし、後者である場合、Table-Bの(2)販売員コードフィールドの0015番のすべてのデータは、  元の販売員と名前が違う訳ですから、どう対応したらよいのでしょう?   永久欠番であれば、まだ分かるのですが、一般に各テーブルの主キーは一度決めたら、 変更しないものなのか、変更もありえるのか教えて欲しいのです。 初心者なので、質問内容が質問になっていないかもしれませんが、宜しくお願いします。