• ベストアンサー

SQL、2つのテーブルで条件一致したものだけdeleteする方法は?

オラクルSQLで質問です やりたいことは、 テーブルAから以下の条件に該当するデータを削除する。 基本的にはテーブルBの内容と比較して、一致したもの。 条件(全ての条件を満たすこと)  テーブルA.AAA = テーブルB.AAA  テーブルA.BBB = テーブルB.BBB  テーブルB.CCC > 0 調べたところ、SQLサーバでは以下のように from を2つ書いて実現できるようです。 が、今回はオラクルなので文法エラーになります。 delete FROM テーブルA FROM テーブルB where テーブルA.AAA = テーブルB.AAA AND テーブルA.BBB = テーブルB.BBB AND テーブルA.CCC > 0 ; commit; よろしくお願いします

  • Oracle
  • 回答数5
  • ありがとう数8

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

  • ベストアンサー
  • THX1138
  • ベストアンサー率51% (108/208)
回答No.3

delete 文の細かい構文はちょっと覚えてませんが サブクエリ使えばいいんじゃないですか delete from table_a where 主キーカラム = ( select table_a.主キーカラム from table_a, table_b where 指定の条件 )

その他の回答 (4)

回答No.5

提示されているSQLサーバのSQLと同等の動作をするSQLは次のような感じです。 delete テーブルA a where a.CCC>0 and exists(select 1 from テーブルB b where a.AAA=b.AAA and a.BBB=b.BBB) ; または delete テーブルA a where a.CCC>0 and (a.AAA,a.BBB) in (select b.AAA,b.BBB from テーブルB b) ;

orabegi
質問者

お礼

みなさん、ありがとうございます。まとめてですいません。 過去のQAを検索したところ以下のものがみつかり、 結局これを利用しました。 >BTABLEのCODEが1のレコードにKEYで関連付く >ATABLEのレコードを削除 >DELETE FROM ATABLE WHERE >( KEY1, KEY2 ) IN ( > SELECT KEY1, KEY2 > FROM BTABLE > WHERE CODE=1 >) まだSQLをはじめたばかりで、 みなさんからの回答もすぐには理解できないレベル なのですが、また参考にさせてもらいます。 ありがとうございました。

回答No.4

いくつ主キーがあるのか分かりませんが・・・。 DELETE FROM A WHERE A.AAA = (          SELECT B.AAA          FROM B          WHERE A.AAA = B.AAA AND              A.BBB = B.BBB AND              B.CCC > 0         ); こんなんでどうでしょ。 見た目上、全角スペースを使っているのでコピペは厳禁。

  • ma-chan45
  • ベストアンサー率31% (46/145)
回答No.2

delete文のどの辺りでエラーが出るのか教えてほしいかも。 テーブルAとテーブルBをカンマでつなげて書くとか? つまり、 delete FROM tableA,tableB where ・・・・ とか、そんな感じではだめですかね?

  • tsuna555
  • ベストアンサー率53% (22/41)
回答No.1

>テーブルB.CCC > 0 >テーブルA.CCC > 0 どちらが本当の条件ですか? あとエラーメッセージを示してください。

関連するQ&A

  • すっきりとしたSQL文にしたいのですが

    Oracle9iにてテーブルのデータを更新しようと思っています。 目的としてはAAAのカラムa1とBBBのカラムb1が同一なレコードである場合、 AAAのa2にBBBのb2を更新したいのですが、 <条件> AAA:テーブル1 BBB:テーブル2 a1:CHAR b1:CHAR a2:VERCHAR b2:VERCHAR すべて必須で桁数は10 UPDATE AAA SET AAA.a2 = ( SELECT BBB.b2 FROM BBB WHERE AAA.a1 = BBB.b1) WHERE AAA.a1 = ( SELECT BBB.b1 FROM BBB WHERE AAA.a1 = BBB.b1) ; いまはこんな無駄の多そうなSQLしか分かりません。 この他にも条件が2つ追加される予定なので もっとすっきり更新できる方法を教えていただけませんでしょうか? よろしくお願いします。

  • SQL 条件付きDELETE文について

    SQLを見よう見まねでいじることになりました。。 AテーブルからBテーブルの以下の条件が当てはまるデータを削除する SQLを作りたいと考えています。  (1)Bテーブルの『DAT_FLG』が1  (2)A.テーブル『KNR_NO』 と Bテーブル『KNR_NO』が同じ  (3)Aテーブル『STR_YMD』 と Bテーブル『STR_YMD』が同じ  (4)Aテーブル『END_YMD』 と Bテーブル『END_YMD』が同じ 以下のようなSQLを考えましたがエラーとなってしまいました。 DELETE FROM A JOIN B ON A.KNR_NO = B.KNR_NO and A.STR_YMD = B.STR_YMD and A.END_YMD = B.END_YMD B.DAT_FLG = '1' DBはoracleを使っています。 どなたか教えてください。

  • SQLでご助言いただきたく。

    テーブル名:AAA カラム: 'fname' ,ename テーブル名:BBB カラム: "id",fcode テーブル名:CCC カラム : "id",'fname',date 上記三つのテーブルAAA,BBB,CCCにそれぞれカラムがあります。 最終的に ename fcode date の3カラムを結合した状態でSELECTします。 ただし、条件として AAAのfname列とCCCのfname列を紐付けし、尚且つ BBBのid列とCCCのid列を紐付けし、尚且つ CCCのdate列が2012-10-31以上のものだけをSELECTしたいです。 上記を踏まえて下記二点ご質問致します。 (1)私が考えたSQL文は select a.ename ,bc.fcode ,bc.date from AAA a , (select b.fcode ,c.fname ,c.date from BBB b , CCC c where b.id = c.id and c.date >= '2012-10-31' ) bc where a.fname = bc.fname ; です。先にBBBとCCCから紐付けしその結果とAAAを紐付けしています。 このSQL文で間違いがないかどうか判定していただきたく。 (2)もっとスマートな書き方(短く書けるなど)がありましたら、 ご助言いただきたく。 ちなみにデータベースはオラクル仕様です。 宜しくお願い致します。

  • selectでテーブルから2つの値を引っ張る

    table 123 id name ------- 1 aaa 2 bbb 3 ccc table 987 from to ------- 1 2 2 3 3 1 という表があります。これを from to ------- aaa bbb bbb ccc ccc aaa という様に表示させるためのSQL分がわかりません。 1つの表から2つを引っ張るのはどうすればいいのでしょうか?

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

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

  • SQL抽出順番

    SQLの質問なんですが 以下のSQLがあるとします。 select カラムA、カラムC from test_table where in ('AAA','BBB','CCC'); ※条件はカラムAの値を使用しています。 結果が AAA 111 BBB 222 CCC 333 と出るとします。 下のように条件を変えたとき where in ('BBB','CCC','AAA'); BBB 222 CCC 333 AAA 111 と抽出と変わるようにしたいのですが、 (in句の左から順番にレコードが抽出したいです) 何か良い方法はありますでしょうか? rowid順で出力されてしまうのでしょうか? 以上です。 よろしくお願いします。

  • SQL 複数条件を設定

    PostgreSQLを使用しております。 それぞれ、TABLE1とTABLE1があり、 TABLE1 a-1   a-2   b-1    ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    1   bbb   aaa   ddd      2   ggg   bbb   ccc        3   bbb   mmm  ddd       4   ggg   mmm  ccc    : TABLE2   a-1   a-2        c-1   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄     1   bbb   aaa        eee         2   ggg   mmm       qqq    : 質問1. TABLE1.a-1=TABLE2.a-1 and TABLE1.a-2=TABLE2.a-2 を条件にして結合 したい場合、どのように結合すればよいのか。 期待結果 a-1   a-2   b-1  c-1   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄    1   bbb   aaa   ddd  eee    2   ggg   bbb   ccc   ※    3   bbb   mmm  ddd   ※    4   ggg   aaa   ccc   qqq ※は空白でもNULLでもよい 質問2. 上記が可能な場合にさらに質問です。 TABLE1およびTABLE2が、SELECT,WHEREによって抽出されたものとした場合、 1つのSQL文で質問1と同様の出力にするにはどのように結合すればよいのか。(はたまた無謀なのか) 知識不足のため悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。

  • SQLのDELETEについての条件

    いつもお世話になってます。 タイトルの通りなのですが、SQLを触れたばかりなので、DELETE文の条件をどう書くか悩んでいます。 以下のテーブルAとテーブルBがあるとします。 テーブルA NO CODE  GROUP ---+------+------- 001 A20  AAAA 002 B10  AABB 003 B20  BBBB 004 A20  AABB 005 A10  BBBB 006 B10  AAAA テーブルB NO  ID  COMMENT ---+------+-------- 001 100  ****** 002 100  ****** 003 120  ++++++ 004 140  <<<<<< 005 170  \\\\\\ 006 110  %%%%%% 007 120  !!!!!! DELETEの条件として行いたいのは テーブルAのCODEが'A20'で、 テーブルAのその条件のNOとテーブルBのNOが同じものの時、条件に合ったテーブルBのレコードを削除したいものです。 例のテーブルでいえば、テーブルAはそのままで、テーブルBが次のようになるようにしたいです。 テーブルB NO  ID  COMMENT ---+------+-------- 002 100  ****** 003 120  ++++++ 005 170  \\\\\\ 006 110  %%%%%% 007 120  !!!!!! 分かりづらい説明かと思いますが、よろしくお願いします。 不明点があれば、補足にて追加していきます。

  • 外部結合とor条件混在の記述方法

    下記のように外部結合とOR条件を同時に使用するとエラーになってしまいます。 FROM句で記述する必要があると思いますが、 下記と同様の仕様を実現するにはどう書けばよいでしょうか? アドバイスお願いします。 SELECT A.* FROM A, B WHERE ((A.AAA = 0 AND A.BBB = B.BBB(+)) OR (A.AAA = 1 AND B.BBB(+) = 0)) ●実現したいこと A.AAAが0の場合:A.BBB= B.BBBのデータ または A.AAAが1の場合:B.BBB=0のデータを抽出したい ●前提 ・Bテーブルに存在しなくともAテーブルを抽出したい ・実際は他にも抽出条件・参照テーブルはあります

  • SQLでできること

    SQLだけでできることと、できないことって、一言で言い表せるでしょうか? データベースからデータを取り出すとき、どこまでできて、どこからはphpなど他の言語で処理したらいいのか、とても気になるんです。 もしかして、何でもできるのかな? というのも、今やりたいと思っていることが、 (環境はMySQL+PHP使用で、ブラウザで表示させます) テーブル A(人物のリスト) id|name ------- 1 | aaa 2 | bbb 3 | ccc 4 | ddd テーブル B(人物と成績のリスト) name| point ------------- aaa | 10 bbb | 15 bbb | 10 aaa | 20 bbb | 25 ccc | 30 のようなテーブルがあったとき、 aaaのpointの合計 = 30 bbbのpointの合計 = 50 cccのpointの合計 = 30 dddのpointの合計 = 0 ← テーブルBに載ってない人もいる という人物全員の結果の集計をするには、どうすると最適でしょう? 私がすぐ思いつくのは、テーブルAのデータを配列に読み込んで、それを元に次はテーブルBから、人物別の行を取り出すSQL文を作って、pointを集計するという手順です。他に手段はあるでしょうか?

    • ベストアンサー
    • MySQL