• 締切済み

まとめてUPDATEしたいのですが。

まとめてUPDATEしたいのですが。 下記のようなUPDATE文を実行したいのですが、思ったとおりの動作をしません。 UPDATE table1 AS TB1 INNER JOIN table2 AS TB2 ON TB1.table2_id=TB2.id SET TB2.point = TB2.point - TB1.remainder_point, TB1.remainder_point = 0 WHERE TB1.remainder_point > 0 最初の1レコード目だけ「TB2.point = TB2.point - TB1.remainder_point」が実行されますが、 その後のレコードが「TB1.remainder_point = 0」で値が全て0になるらしく、減算処理が行われません。 上手くまとめて実行できる良い書き方は無いでしょうか。

  • kaz33
  • お礼率64% (25/39)
  • MySQL
  • 回答数2
  • ありがとう数3

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

すなおに SET TB2.point = TB2.point - TB1.remainder_point の処理をしたあとに SET TB1.remainder_point = 0 のSQLを再度発行すればいいでしょう。 そんな手間を惜しむほどのものでもないし。

  • moousi
  • ベストアンサー率70% (21/30)
回答No.1

問題ないような? 下記のような構成で、そのUPDATE文を実行してみたところ、すべて更新されました。 create table table1 (id int auto_increment primary key,table2_id int,remainder_point int); create table table2 (id int auto_increment primary key,point int); insert into table2 values (11,200) ,(null,200) ,(null,200) ,(null,200) ; insert into table1 values (null,11,15) ,(null,12,20) ,(null,13,30) ,(null,14,0) ;

kaz33
質問者

補足

記入頂いたテーブルとデータを実行し、私の書いたSQLを実行したところ、table2のポイントが全て200のままです。。 table1はpointが0になるのですが。 MySQL5.0.51を使ってます。 バージョンの違いでしょうか・・・・

関連するQ&A

  • 複数のテーブルを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です。 よろしくお願いいたします。

  • テーブル結合の条件指定について

    以下のようなテーブルが3つある場合に2つのテーブルにあるポイントを合計して取得したいと思っています。 ただ、外部結合しているtable_cに条件を与えるとうまく取得できません。 table_cにcdがある場合は条件を指定し、 ない場合は条件を指定しないようにするにはどうすればいいのでしょうか。 【table_a】 id    name ------------------ a1    aaa a2    bbb a3    ccc 【table_b】 b_id     a_id   user_id    point --------------------------------- b1     a1    00001    5 b2     a1    00002    2 b3     a3    00007    10 b4     a2    00356    10 【table_c】 c_id    user_id    cd     bonus_point ------------------------------------------------ c1     00001    cd_1    1 c2     00007    cd_2    1 c3     00356    cd_1    1 SELECT table_b.user_id as user_id , (ifnull(table_b.age_count) + ifnull(table_c.bonus_point, 0)) as total_point FROM table_a INNER JOIN table_b ON (table_b.a_id=table_a.a_id)    LEFT JOIN table_c ON (table_c.user_id=table_b.user_id) WHERE table_c.cd = 'cd_1' ORDER BY total_point desc ■結果 user_id    total_point ----------------------------- 00356     11 00001      6 ■求めたい結果 user_id    total_point ----------------------------- 00356     11 00001      6 00002     2 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • NOT INをNOT EXISTSで書き直したい

    こんにちは。SQLでNOT INが実行速度が遅いため、EXISTSで書き直したいのですが、思っている結果がでません。 SQLのどこが間違っているかお教え頂けませんでしょうか? ■ ・テーブル名:R_TABLE ・フィールド:id データ: id(ユニークではない) 001 002 003 003 003 007 008 009 ■ ・テーブル名:P_Master ・フィールド:id データ: id(ユニーク) 001 002 003 ■やりたい事 R_TABLEのデータを条件によって削除したい。 条件はP_MASTERに無いR_TABLEの行を削除したいです。 ■欲しい結果 R_TABLE 001 002 003 003 003 ■書いたSQL DELETE FROM R_TABLE WHERE R_TABLE.id NOT IN (SELECT R_TABLE.id FROM R_TABLE INNER JOIN P_MASTER ON R_TABLE.id = P_MASTER.id) これは正しい結果がでました。 書きなおしたSQL DELETE FROM R_TABLE WHERE R_TABLE.id WHERE NOT EXISTS (SELECT R_TABLE.id FROM R_TABLE INNER JOIN P_MASTER ON R_TABLE.id = P_MASTER.id) 結果はR_TABLEから何も消されていませんでした。 どこを修正すれば正しい結果が得られるでしょうか? 副問い合わせで、R_TABLEとP_MASTERのINNER JOINの結果が得られ、R_TABLEからINNER JOINに含まれないデータ削除しろという命令だと思っていたのですが違うみたいです。 どこを修正すればよろしいでしょうか? よろしくお願いします。

  • 外部キーが設定されているテーブルのupdateについて

    PostgreSQL8.24を利用しています。 pgADMINIIIでテーブルを作成しました。 【TABLE_A】と【TABLE_B】があります。 【TABLE_A】の【ID】が【TABLE_B】の【ID2】が外部キーとして設定してあります。 CONSTRAINT TABLE_B_fkey FOREIGN KEY (ID2) REFERENCES TABLE_A (ID) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION 上記のように記述されています。 SQL文のUPDATEを使い、IDが「01」を「05」に更新したいのですが、 以下のように記述するとエラーになります。 どのようなUPDATE文を記述すればよろしいのでしょうか。 UPDATE TABLE_A INNER JOIN TABLE_B on TABLE_A.ID=TABLE_B.ID2 SET TABLE_A.ID = '05',TABLE_B.ID2 = '05' WHERE TABLE_A.ID='01'" よろしくお願いいたします。

  • 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
  • inner joinについて

    SQLのデータ抽出方法についてお教え下さい。 TABLE_2をdistinctで重複を無くして、TABLE_1とinner joinさせたいです。 select distinct TABLE_2.id と select TABLE_1.ID from TABLE_1 inner join distinct TABLE_2.ID といったようなことをやりたいです。 TABLE_1 ID 001 001 002 002 002 TABLE_2 ID 001 001 002 002 002 環境はMYSQL5.5になります。よろしくお願いいたします。

  • 複数テーブルからデータを取り、updateする

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=1211685 にも同じような質問があったのですが、同様の処理でうまくupdateされません。分かる方がいらっしゃいましたら教えてください。 今、テーブルが2つ(table1、table2)があり、それぞれ2つのカラム(column1、column2)を持っています。ここで、それぞれのカラム2が等しく、カラム1が指定した値のレコードのみ値をupdateしたいです。 update table1 set column1 = 'AAA' from table1,table2 where table1.column2 = table2.column2 and table1.column1 = 'BBB' and table2.column1 = 'CCC' としたところ、「from table1,table2 where 」の辺りに間違いがあると表示されます。 上の例とどう違うのか分かりません。 よろしくお願いします。m(__)m

  • 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

  • updateができない。

    mysql-4.1.11を使っています。 ひとつのDBの中にtableがふたつあります。仮にtable1,table2とします。 このふたつのテーブルについて select * from table1,table2 where table1_col1=table2_col1; というふうにすると、table1_col1とtable2_col1の値が等しいものだけ抽出してくれます。table1_co1,table2_col2というのはそれぞれのテーブルのカラムのひとつです。 しかし、同じ条件で update table1,table2 set table1_col2="A" where table1_col1=table2_col1; という命令を実行しても 「Query OK, 0 rows affected (0.00 sec) Rows matched: 0 Changed: 0 Warnings: 0」 というメッセージが出るだけでtable1_col2の値が変わりません。本当なら3つのデータが変わるはずです。 命令の仕方がおかしいのでしょうか? ほかにおかしなところがあるのでしょうか? よろしくおねがいします。

  • SQLの外部結合について教えて下さい

    いつもお世話になっています。 SQL構文の外部結合が分らなくて困っています。 どうか教えて下さい。 JSPからString Nam = (request.getParameter("param"));で値を受け取ってその値でT_Tableと一致するデータのSQLを実行します。 SELECT * FROM T_Table where ID='"+ Nam +"' order by 日付 desc この結果とT_TableAの「番号」というフィールドと一致する問い合わせのSQLが分りません。自分なりに考えて作りましたがHTMLの部分の表示だけでレコードが表示されないので間違っているのだと思います。 色々調べてみましたが該当のサンプルがなかったので困っています。 教えて下さい!宜しくお願い致します。 【自分で作成してみたSQLです】 テーブルはSQL Serverです。 "SELECT * FROM T_Table where ID='"+ Nam +"' INNER JOIN where ID='"+ Nam +"' ON [T_Table].[番号] = [T_TableA].[番号] order by 日付 desc"

    • ベストアンサー
    • Java