UPDATE文で、書き換えるデータは固定だけどレコードを固定できない場合は・・・?

このQ&Aのポイント
  • OracleのUPDATE文で、書き換えるデータ自体は固定だが、対象行が他のテーブル条件を参照する場合の方法を教えてください。
  • INNER JOINを使用して実現しようとしたが、SETキーワードがないためエラーが発生しました。
  • 具体的なSQLクエリが示されており、書き換えるデータが0であるが、該当するカラム条件が複数あり、どのように記述すればよいのか分からないとの質問です。
回答を見る
  • ベストアンサー

UPDATE文で、書き換えるデータは固定だけどレコードを固定できない場合は・・・?

もうかなり考えたのですが、なかなか答えが出てきません。 OracleのUPDATE文なのですが、書き換えるデータ自体は固定ですが、その対象行が他のテーブル条件を参照する場合どうすればよいのでしょうか? うまく書く方法が分からず、INNER JOIN で実現しようとしたらSETキーワードがありません(ORA-00971)になってしまい・・・。 --------- UPDATE テーブル1 INNER JOIN テーブル2 ON テーブル1.ID = テーブル2.ID AND テーブル1.DAT1 = TO_CHAR(テーブル2.DAT + 固定データ) AND TO_CHAR(テーブル2.DAT2 + 固定データ) = 4 SET テーブル1.MONEY4 = 0 WHERE テーブル1.MONEY4 > 0 --------- こんな感じのSQLです。 ようは、書き換えるデータは0なんですが、その該当するカラム条件が別に複数あって、どのように書けばよいのかが分かりません。。。 誰か詳しい人、よろしくお願いいたします。

  • Oracle
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • riveron77
  • ベストアンサー率48% (180/370)
回答No.1

事前確認してませんが…勘でw UPDATE テーブル1 SET テーブル1.MONEY4 = 0 WHERE テーブル1.ID IN(   SELECT テーブル1.ID   FROM     テーブル1     INNER JOIN テーブル2     ON テーブル1.ID = テーブル2.ID     AND テーブル1.DAT1 = TO_CHAR(テーブル2.DAT + 固定データ)     AND TO_CHAR(テーブル2.DAT2 + 固定データ) = 4   WHERE テーブル1.MONEY4 > 0 )

buragyan
質問者

お礼

動きました!ありがとうございます!! これは、WHEREの後にIDがIN以下のサブクエリでヒットしたものと合致した~ってことになるんですね・・・。 助かりましたー。。。

その他の回答 (1)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

こんなんじゃだめでしょうか UPDATE テーブル1 SET テーブル1.MONEY4 = 0 WHERE テーブル1.MONEY4 > 0 AND EXISTS ( SELECT 1 FROM テーブル2 WHERE テーブル1.ID = テーブル2.ID AND テーブル1.DAT1 = TO_CHAR(テーブル2.DAT + 固定データ) AND TO_CHAR(テーブル2.DAT2 + 固定データ) = 4 )

関連するQ&A

  • UPDATE文のエラー直せますでしょうか?

    テーブル A と テーブル B は同じ構造です。 A のレコードを B のレコードで更新するにはどうすれば良いのでしょうか? UPDATE a Set( a.id = b.id, a.dat = b.dat ) FROM a INNER JOIN b ON a.id = b.id #1064 - You have an error in your SQL syntax; the right syntax to use near '( a.id = b.id, a.d = b.d ) FROM a INNER JOIN b ON a.id = b.id' at line 1 MySQL 5.1.33 CREATE TABLE `a` ( `id` INT NOT NULL , `dat` INT , PRIMARY KEY ( `id` ) );

    • ベストアンサー
    • MySQL
  • update文の一括発行

    お世話になります。 parent_idという親テーブルのIDを格納するフィールドと idという自分のIDを格納するフィールドと データを格納するdataというフィールドがあるtbl01というテーブルがある場合に update tbl01 set data = 'xxx' where parent_id = 1 and id = 1 update tbl01 set data = 'yyy' where parent_id = 1 and id = 2 update tbl01 set data = 'xyz' where parent_id = 1 and id = 3 ※dataに格納するデータは親テーブルとは関係ない独立したデータです。 という感じにparent_id = 1が格納されているレコードにデータを次々と更新していきたいのですが 1回のupdate文でまとめて発行するやり方はあるのでしょうか。 1回1回発行するのは時間がかかるためできれば1回でまとめて発行したいのです。 update tbl01 set data in ('xxx', 'yyy', 'xyz') where parent_id = 1 and id in(1, 2, 3) イメージとしてはこんな感じです。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • MySQLのUPDATE文が分かりません。

    2007年12月31日付けでEmployeesテーブルのA型の人にだけ特別給料5000円を追加するというもので Employeesテーブルには血液型(BloodType)があり給料(Amount)や支払月(PayDate)は、Salaryテーブルにあります。 UPDATE Salary INNER JOIN Employees ON Salary.EmployeeID = Employees.EmployeeID SET Amount = Amount + 5000; AND SET PayDate = '2007-12-31' FROM Salary WHERE BloodType = 'A'; ネットなどで調べて上記のコードを書いて試してみたんですがうまくいきませんでした。 どのようなコードを書くと正しく実行できるのでしょうか?

    • ベストアンサー
    • MySQL
  • update文について

    update文についてACEESSのクエリのようにテーブル結合することは可能でしょうか? できない場合、それに変わる方法をご教授いただけないでしょうか? 現在、ORA-01427 単一行副問合せにより2つ以上の行がもどされます。がでて困っています。 単純にJOINして右から左へ値を移したいだけなのですがやり方が思いつきません。 何卒宜しくお願い致します。

  • SQLでSELECTした一覧をUPDATEする方法を教えてください。

    AのテーブルをINNER JOINのWHERE文を用いて、selectした結果の項目にBテーブルの内容をUPDATEしたいのですが、 下記方法でうまくいきません。 解決方法を教えてください。 よろしくお願いいたします。 SELECT A.PointZan FROM A INNER JOIN B ON A.Code = B.Code WHERE (B.TrDate = '091012') AND (B.Comment = '失効中止') UPDATE A SET PointZan = (SELECT B.PointZan FROM B INNER JOIN A ON B.Code = A.Code WHERE (B.TrDate = '091012') AND (B.Comment = '失効中止'))

  • レコードAとBが等しい場合にupdateしたい!

    Mysqlの命令文作成で完全に詰まってしまって途方に暮れています。 添付画像にあるように、テーブルAのanwserの値とテーブルBのuser_answerの値が同じ場合に、テーブルBのanswer_flagを0から1に変更するというMYSQLの命令文を書きたいのですが、上手く行きません。。。 UPDATE tbl_quiz_log SET answer_flag = 1 WHERE user_answer = ANY( SELECT tbl_question.anwser FROM tbl_question INNER JOIN tbl_quiz_log ON tbl_quiz_log.question_id = tbl_question.question_id ) 何が間違っているのでしょうか? どなたかお力をお貸し頂けませんでしょうか? どうぞよろしくお願い致しますm(_ _)m ●補足 ※1 キャプチャー画像のカラムは一部のカラムのみ表示している状態です。 ※2 ちなみに、テーブルAのanswerがスペルミスなのは把握しております。

    • ベストアンサー
    • MySQL
  • Oracle UPDATE 文 を教えて下さい

    お世話になります。 テーブルがA,Bと2つあり、Aの内容をBの内容と一致するようにUPDateしたい。 各テーブルには各々下記のフィールドがあります。 テーブルA フィールド DK、  NUM  テーブルB フィールド DKA、 DKB DK=DKAのときに 下記条件でデータセットしたいのですがUPDATE文がわかりませんご教授お願いします。 DKにDKBを NUMは20ケタのSTRINGで 1から13桁目まで元のNUMの文字を 後ろ7桁にDKBと7桁に満たない場合は頭に0を付加した文字をセットしたい。 DK=DKB NUM=concat(substr(NUM,1,13),lpad(to_char(DKB),7,'0') 以上 宜しくお願いします。

  • update文におけるwhereとjoinの違いについて

    はじめまして。 副問い合わせを使ったUPDATE文でわからない点があり、質問させていただきます。 使用しているDBはORACLE10gです。 SALARYとEMPLOYEESという二つのテーブルがあり、SALARY列とEMPLOYEES列には主キーとなるEMPLOYEEID列があります。 ここで、以下のSQLを発行した際に【1】は正しく更新され、【2】は「ORA-01427:単一行副問い合わせにより2つ以上の行が戻されます」というエラーが出ます。 whereを使った結合とjoinを使った結合は同じだと思っていたのですが、なぜこのように結果が異なるのかがわかりません。 どなたかご教示いただけないでしょうか。 【1】 UPDATE SALARY SET SALARY.AMOUNT = SALARY.AMOUNT + (SELECT AMOUNT FROM EMPLOYEES INNER JOIN SALARY s ON EMPLOYEES.EMPLOYEEID = s.EMPLOYEEID) 【2】 UPDATE SALARY SET SALARY.AMOUNT = SALARY.AMOUNT + (SELECT AMOUNT FROM EMPLOYEES WHERE SALARY.EMPLOYEEID = EMPLOYEES.EMPLOYEEID) 説明不足の点があればご指摘ください。よろしくお願いします。

  • 1テーブル&複数レコードの更新に対して1度のupdate文での処理方法

    1テーブル&複数レコードの更新に対して1度のupdate文での処理方法 Delphi2010+SQL SERVER 2005で開発しています。 update文で、 現在下のようにwhileで複数レコードに対して、 1回、1回、sqlを発行して、更新しています。 これを、一度のSQLの発行で処理できないものでしょうか? 更新テーブルは1つで、更新する項目も同じです。 更新するデータと、where句の条件が異なります。 もし可能なようでしたら、どうかご教授お願いします。 update table set A=1,B=2 where id=1 update table set A=2,B=3 where id=5 update table set A=9,B=99 where id=7 update table set A=5,B=10 where id=15 update table set A=1,B=10 where id=75

  • 複数のテーブルをJOINして更新する方法

    複数のTABLEをJOINさせてアップデートをしたいと思っています。 TABLE1とTABLE2のCODEはJOINができます。 TABLE1とTABLE3のJANはJOINができます。 TABLE2にはJANフィールドがありません。 TABLE3のSTOCKをTABLE2のSTOCKに代入したいと思います。 以上の条件により下記のSQLを作って見ました。 UPDATE (TABLE1 INNER JOIN TABLE2 ON TABLE1.CODE = TABLE2.CODE) INNER JOIN TABLE3 ON TABLE1.JAN = TABLE3.JAN SET TABLE2.STOCK = TABLE3.STOCK WHERE TABLE1.FLAG=0 本を読んでみると、SELECT文による複数のテーブルからデータを引っ張ってくる例は載っているのですが、複数のTABLE情報を元にUPDATEする例は載っていませんでした。上記のようなコードはあっているでしょうか?利用している環境はWin XP Pro、MYSQL 5.5です。 よろしくお願いいたします。