PL/SQLでUPDATE別テーブル条件を付加する

このQ&Aのポイント
  • PL/SQLでUPDATEする際、別のテーブルからの条件も付加し更新を行いたいのですが、可能でしょうか?
  • テーブル名T_NAMEのSEI='1'の時以下のロジック処理を行いたいのです。
  • UPDATE T_ADRS SET DLT_FLG = '1', USER_ID = inUSER_ID, TNMT_ID = inCOMP_ID, UPD_DT = SYSDATE WHERE RTRIM(ADR_CD) = RTRIM(strADR_CD) AND RTRIM(DATA_SY) = RTRIM(strDATA_SY) AND RTRIM(IMP_NO ) = RTRIM(strIMP_NO );
回答を見る
  • ベストアンサー

PL/SQLでUPDATE別テーブル条件を付加する

PL/SQLでUPDATEする際、別のテーブルからの条件も付加し更新を行いたいのですが、可能でしょうか? 教えて下さい。 どうぞよろしくお願い致します。 テーブル名T_NAMEのSEI='1'の時以下のロジック処理を行いたいのです。 UPDATE T_ADRS SET DLT_FLG = '1' , USER_ID = inUSER_ID , TNMT_ID = inCOMP_ID , UPD_DT = SYSDATE WHERE RTRIM(ADR_CD) = RTRIM(strADR_CD) AND RTRIM(DATA_SY) = RTRIM(strDATA_SY) AND RTRIM(IMP_NO ) = RTRIM(strIMP_NO );

noname#11049
noname#11049

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

  • ベストアンサー
  • sueoka
  • ベストアンサー率38% (24/62)
回答No.1

こんばんわ ちょっと自信がないのですが・・・ 質問の内容は、 1)必ずT_NAMEとリンクさせて、T_NAMEのSEIが'1'のデータのみ更新対象とする 2)T_NAMEに存在しないデータも更新対象とするが、T_NAMEのSEIが'1'のデータは 特別に更新項目が追加される のどちら(又は、どちらでもない?)でしょうか? まず1)の場合ですが、 UPDATE T_ADRS TBL_A SET DLT_FLG = '1' WHERE ...(中略)... AND EXISTS(  SELECT 1 FROM T_NAME TBL_N  WHERE TBL_A.ID = TBL_N.ID  AND TBL_N.SEI = '1'  AND ROWNUM = 1) とすれば実現できるかと。 EXISTSと言うのは「存在する」と言う意味で、 EXISTSに続く括弧内のSELECT文に対応するデータが存在するかどうかを判定してくれます。 で、実際のSELECT文の内容ですが、更新対象のテーブル「T_ADRS」と 条件判断様のテーブル「T_NAME」をリンクさせて、条件文を記述しています。 このSELECT文に該当するデータが存在する場合はEXISTSがTRUEになりますので、 更新対象となり、該当するデータが存在しない場合は更新対象になりません。 次に2)の方ですが、 UPDATE T_ADRS TBL_A SET DLT_FLG = (  SELECT DECODE( TBL_N.ID, '1', '1', TBL_A.DLT_FLG)  FROM T_NAME TBL_N  WHERE TBL_A.ID = TBL_N.ID(+)  AND ROWNUM = 1 ) WHERE ...(後略) で大丈夫だったと思います・・・ これは、SELECT文の内容をDLT_FLGにSETする・・・と言うSQLですが、 SELECTの内容はT_NAMEを外部結合しています。 これによって、T_NAMEが存在しない場合はそのままT_ADRSのDLT_FLGを使い、 存在しかつSETが'1'の場合は'1'で更新します。 ※存在するがSEIが'1'では無い場合はDLT_FLGが使われます。 余り良いSQLでは無いかも知れませんが、 取りあえず思いついたのはこれくらいです。 長々と書いてしまいましたが、 的外れの回答だったら、すんません

noname#11049
質問者

お礼

まだ、試していませんが頑張ってやってみます。 迅速なアドバイスありがとうございました。

関連するQ&A

  • SQL 複数テーブルのupdate

    こんばんは。 複数テーブルの複数カラムをupdateしたいのですが、 うまくいかず困っています。 どなたか助けてください>_< テーブルA(tableA)のoptionAというカラムと、 テーブルB(tableB)のoptionBというカラムを両方更新したいんです。 やりたい内容のイメージとしてはこんな感じです↓ update tableA a, tableB b set a.optionA='OK', b.optionB='OK' where a.student_id=b.student_id and a.name='山田'; どなたかご指導お願いいたします。

  • 2つのテーブルの間で条件に合致した行を合計して引きたい

    すいません、適切なタイトルが浮かばず、あやふやなタイトルになってしまいました・・・ MySQLバージョン4.1.16を使っています。 2つのテーブルがあって、 table1には「id,x,y,value1」、table2には「x,y,value2」、 の列がそれぞれあるとします。 サンプル [table1] id,x,y,value1 1 1 1 100 2 1 2 160 3 1 3 120 [table2] x,y,value2 1 1 20 1 1 30 1 3 10 table1のidが1で、table1のx,yとtable2のx,yがそれぞれ等しい場合にのみ table1のvalue1からtable2のvalue2(列でxが同じ、yが同じ行があったならvalue2を合計して)を 引くということがやりたいのです。 そこで以下のようにして試してみたのですが、 UPDATE table1 t1, table2 t2 SET t1.value1 = t1.value1 - t2.value2 WHERE t1.id = '1' AND t1.x = t2.x AND t1.y = t2.y; これだとtable2の行が1つだと希望どおりに動作するのですが、 2つ以上だと1つ目の行しか引いてくれません。 サンプルに当てはめると、[table1]のid=1のvalue1は80になります(希望は50) どのようにSQLを記述すれば良いのでしょうか?

    • ベストアンサー
    • MySQL
  • Sql文のUpdateと副問い合わせで困っています。

    お世話になっております。Sql初心者でUpdate文の書き方で困っております。ご教授の程宜しくお願い致します。 下記のような2つのテーブルがあります。 関係はTotalが合計を表すテーブルでDetailが明細を表すテーブルです。OTとNoの組み合わせで一意となります。TotalテーブルのTotalAmountはDetailテーブルのAmountの合計です。 行いたいUpdateは『TotalAmountとTotalの合計が合わないもののみTotalAmountをOTとNoで紐ずくDetailテーブルのAmountの合計で更新する』です。 ■テーブル名:Total ------------------------------------------------------- 列名) OT No TotalAmount ------------------------------------------------------- 20 100000 0 20 100001 0 20 100002 10 ■テーブル名:Detail ------------------------------------------------------- 列名) OT No Amount ------------------------------------------------------- 20 100000 10 20 100000 10 20 100001 20 20 100001 30 20 100002 5 20 100002 5 ■作成したSql update Total set TotalAmount = (select Sum(Amount) from Detail Inner Join Total on Detail.OT = Total.OT and Detail.No = Total.No group by Total.TotalAmount,Total.OT,Detail.OT,Total.No,Detail.No having Total.TotalAmount <> sum(Detail.Amount) ) where OT = (select OT from Detail) and No = (select No from Detail) and TotalAmount <> (select sum(Amount) from Detail) いろいろ試行錯誤しながら作成しましたが『サブクエリは複数の値を返しました ~ 』というエラーが出てしまいます。 つっこみどころ満載だと思いますがご教授の程宜しくお願い致します。

  • テーブル結合条件でのアップロードは???

    テーブルを結合したという条件でデータのアップロードを実行したいのですが・・・できません 間違っている個所を教えていただけませんでしょうか。 例えば画像のように2つのテーブルがあったとします。 SELECTでの抽出条件は下のような感じです。 select A_ID, A_KY, A_BETU, B_ID, B_KY from A, B where A_ID = B_ID and A_BETU = B_ID and (A_ID = 'A599' and A_KY = 'K1') ; セレクト自体はこれでうまくいきますが、この条件でアップデートの書き方がわかりません。 update TBL_B set B_UP = '++++++' where ? ? ? ? ? どなたか条件の付け方をご教示いただけませんでしょうか。

  • sql: update またはinsert を判断して1回で実行するには

    わかりやすいように単純にしていますが table1に ID と titleフィールドがあるとして、 update table1 set title = 'no1' where ID = '1' と insert into table1 (ID,title) values ('1','no1') これを一個にまとめたいのですが、 一回のSQLで 指定したIDが なければ、挿入、存在すれば、アップデート みたいな処理は可能でしょうか? CASEとかEXISTS とかの組み合わせでできますでしょうか? 最近まで、SQLを利用したデータベースほとんど 利用していなかったので 初歩的なことで申し訳わけありませんが インターネットの解説サイトをみてもわからないので SQLの本を購入しましたが届くのが来週以降なので もし できるのでしたら、 使う関数名だけでもいいので教えてください。

  • SQLで条件に合うデータの前後に文字をスマート付加

    こんにちは データベース(mdbファイル)で、次のような置き換えをしたいのですが、スマートなやり方をご存じでしたら教えてください。 Membersテーブル id, name, status 1, 田中, 200 2, 鈴木, 300 3, 高橋, 200 4, 中村, 400 Membersテーブルのうち、status が 200 のレコードになっている name の前後に「ABC」と「XYZ」を付加する、という操作です。 置き換え作業後は次のようになります。 Membersテーブル id, name, status 1, ABC田中XYZ, 200 2, 鈴木, 300 3, ABC高橋XYZ, 200 4, 中村, 400 Where status = 200 と指定して、帰ってきたレコードをループさせて、1件ずつUpdateすればできるのですが、そもそもSQLコマンドの時点でスマートにできるのではないかと思い質問した次第です。SQLは詳しくないのですが、意外に柔軟でスマートなことができるようですので。。。 対象のファイルはmdbで、スクリプトはまだ作っていませんが、vbsになるのではないかと思っています。 Windows 7 and 8 64bit MS Accessはありません

  • SQLのUPDATE文に関して教えて下さい

    SQLのUPDATE文に関して教えて下さい まだまだ初心者で勉強中なのですが、ご教授をお願い致します。 2つのテーブルがあり同じ条件になったレコードのある項目を別のもう片方の項目にセットしたいのですが上手くいきません。 具体的には以下の通りです。 【テーブル1】 品番、 規格、 取引先、 日付 A1   XXX  T001   2010/01/01 A1   YYY  T002   (空白) B1   XXX  T001   (空白) C1   ZZZ  T003   (空白) 【テーブル2】 品番、 規格、 取引先、 受入日 A1   XXX  T001   2010/01/01 A1   YYY  T002   2010/03/01 B1   XXX  T001   (空白) テーブル1の「日付」が(空白)のレコードを対象に、 テーブル1の「品番+規格+取引先」とテーブル2の「品番+規格+取引先」が同じな場合、 テーブル1の「日付」項目にテーブル2の「日付」項目をUPDATEしたいと考えています。 結果を以下のようにしたいです。 【テーブル1】 品番、 規格、 取引先、 日付 A1   XXX  T001   2010/01/01 A1   YYY  T002   2010/03/01  ←ここが今回更新される B1   XXX  T001   (空白) C1   ZZZ  T003   (空白) 以前この場で教えて頂いたものを参考に以下のような感じで考えていたのですがエラーになります。 update テーブル1 set テーブル1.日付 = テーブル2.受入日 where テーブル1.日付 Is Null and (concat(concat(品番, 規格), 取引先)) in (select (concat(concat(品番, 規格), 取引先)) from テーブル2) ; ERROR at line 1: ORA-00904: "テーブル2"."受入日": invalid identifier set文のところの記述方法がわかりません。 宜しくお願い致します。

  • SQL2000 ワークテーブルの作成文について

    いつもお世話になっております。 SQLを学んで3ヶ月の初心者です。 下記の内容でご理解いただけ、分かる方がいましたら教えていただけないでしょうか。 一応、自分なりに以下作成したのですが、結果が反映されなく困っています。 よろしくお願い致します。 ※質問内容※ ・条件に従い、Aテーブルから必要な項目を抜き出し、Bワークテーブルを作成する。 ・@・・・頭で宣言しています。 delete from Bワークテーブル insert into Bワークテーブル ( ID, CD, 伝票番号, 部門CD, 引当日, ユーザID, ) select Aテーブル  Cテーブル.ID,  Aテーブル.CD,  Aテーブル.伝票番号,  Aテーブル.部門CD,  Aテーブル.引当日,  Aテーブル.ユーザID, from Aテーブル INNER JOIN Cテーブル ON Cテーブル.ID = @ID where Aテーブル.CD = @CD and ((Aテーブル.伝票番号 >= @伝票番号FROM) OR (@伝票番番号FROM IS NULL)) and ((Aテーブル.伝票番号 <= @伝票番号TO) OR (@伝票番号TO IS NULL)) 以上。

  • 同じ構成のテーブルの条件付き結合

    同じ構成のテーブルがテーブル1~テーブル6まであり、6つのテーブルを集計するSQLを作成しています。 カラムは ID、名前、日付1、日付2、ステータス1、ステータス2 です。 IDがプライマリーキーになっており、テーブル1にしかないIDや全てのテーブルに登録されているIDなどもあり、IDの一覧を作成したいです。 IDが重複していた場合、名前はどれを残しても構わないのですが(どのテーブルか指定する必要があるのならばとりあえずテーブル番号が若い方の名前を残すようにしてください。) 日付1は最古の日付 日付2は最新の日付 ステータスは共に優先順位が1>2>0>nullとなっており優先順位が高いほうを残すようにし、ステータスが両方nullの場合は集計しないようにしたいです。 テーブル1 ID、名前、日付1、日付2、ステータス1、ステータス2 111、あああ、2001/1/1、2001/1/1、2、2 222、いいい、2001/1/1、2001/1/1、2、2 333、ううう、2001/1/1、2001/1/1、null、null 555、おおお、2001/1/1、2001/1/1、2、2 テーブル2 ID、名前、日付1、日付2、ステータス1、ステータス2 111、aaa、2002/2/2、2002/2/2、0、null 222、iii、2002/2/2、2002/2/2、1、0 333、uuu、2002/2/2、2002/2/2、null、null 444、eee、2002/2/2、2002/2/2、1、1 結果 ID、名前、日付1、日付2、ステータス1、ステータス2 111、あああ、2001/1/1、2002/2/2、2、2 222、いいい、2001/1/1、2002/2/2、1、2 444、eee、2002/2/2、2002/2/2、1、1 555、おおお、2001/1/1、2001/1/1、2、2 このようなことを6つのテーブルを集計して行いたいです。 SELECT t1.id,MIN(t1.日付1)as 日付1,MAX(t1.日付2)as 日付2,CASE When t1.ステータス1="1" then "1" else t1.ステータス1 end ,CASE When t1.ステータス2="1" then "1" else t1.ステータス2 end FROM( SELECT * FROM テーブル1 UNION All SELECT * FROM テーブル2 UNION All SELECT * FROM テーブル3 UNION All SELECT * FROM テーブル4 UNION All SELECT * FROM テーブル5 UNION All SELECT * FROM テーブル6 )as t1 WHERE NOT(t1.ステータス1 IS null AND t1.ステータス2 IS null) GROUP BY id 日付は出来ていると思うのですが、ステータスで1の優先がまだ出来ていないので修正お願いいたします。

    • ベストアンサー
    • MySQL
  • SQLのUPDATE文についての質問

    下記のSQLを実行したとき 「ORA-00904: "TBLDKPLNID"."KEIKAKU_SAKUTEI_KBN": 無効な識別子です。」というメッセージが出るのですが、 結合の方法に問題があるのでしょうか? UPDATE TBLDKPLNGBST SET SAGYO_STATUS = '1', USER_ID = 'SYSTEM_JOB' WHERE TBLDKPLNID.KEIKAKU_CASE_NO = TBLDKPLNGBST.KEIKAKU_CASE_NO AND TBLDKPLNID.KEIKAKU_SAKUSEITYU_KBN = '1' AND TBLDKPLNID.KEIKAKU_SAKUTEI_KBN = TBLDKPLNGBST.KEIKAKU_SAKUTEI_KBN AND KEIKAKU_SAKUTEI_KBN = '11111111' AND SAGYO_KOUMOKU_ID = '1111';