- ベストアンサー
複数のテーブルを参照して値を変更する方法
お世話になっております。 以下のようなテーブルがあったとして、table1,table2の値を参照して加算し、master_tableの値を変更するようなSQLは一つの文で書く方法はありますでしょうか? 例えば、あるSQLを実行すると、master_tableのid1のscoreが500になるようなSQLです。 どなたかご教授ください。 master_table id | score 1 | 0 2 | 0 table1 id | score 1 | 100 2 | 300 table2 id | score 1 | 400 2 | 100
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
横からですが、 >table3,table4などもっとテーブルがあった場合につなげて書くことが >できるのでしょうか? できます。 ただし、現在提示されているのは、無条件で全件をunionしているので、もし性能を重視するなら、unionで繋げるそれぞれのselect文で、id列に対する検索条件があった方がいいでしょう。 <update例1> unionを使う方法(ただし、MySQLの複数表の更新の構文使用) update master_table as m, (select x.id,sum(x.score) as sum_score from (select id,score from table1 union all select id,score from table2) as x group by x.id) as xx set m.score=sum_score where m.id=xx.id <update例2> MySQLの複数表のupdate構文を使う方法 update master_table as m,table1 as t1,table2 as t2 set m.score=t1.score+t2.score where m.id=t1.id and m.id=t2.id
その他の回答 (2)
- nora1962
- ベストアンサー率60% (431/717)
UPDATE文版 UPDATE MASTER_TABLE SET MASTER_TABLE.SCORE = ( SELECT S.SCORE FROM ( SELECT R.ID,SUM(R.SCORE) AS SCORE FROM (SELECT TABLE1.ID,TABLE1.SCORE FROM TABLE1 UNION ALL SELECT TABLE2.ID,TABLE2.SCORE FROM TABLE2 ) AS R GROUP BY R.ID ) AS S WHERE MASTER_TABLE.ID = S.ID ) WHERE EXISTS ( SELECT 1 FROM TABLE1 WHERE MASTER_TABLE.ID=TABLE1.ID ) OR EXISTS ( SELECT 1 FROM TABLE2 WHERE MASTER_TABLE.ID=TABLE2.ID )
お礼
UPDATE版のSQLどうもありがとうございます! ところでこのUNION ALLですが、table3,table4などもっとテーブルがあった場合につなげて書くことができるのでしょうか? 例えば、 (SELECT TABLE1.ID,TABLE1.SCORE FROM TABLE1 UNION ALL SELECT TABLE2.ID,TABLE2.SCORE FROM TABLE2 UNION ALL SELECT TABLE3.ID,TABLE3.SCORE FROM TABLE3 UNION ALL SELECT TABLE4.ID,TABLE4.SCORE FROM TABLE4) AS R などというようにできるものなのでしょうか?
- yambejp
- ベストアンサー率51% (3827/7415)
たとえば・・・ REPLACE INTO master_table SELECT id,SUM(score) FROM (SELECT id,score FROM table1 UNION ALL SELECT id,score FROM table2 ) AS X GROUP BY id
お礼
どうもありがとうございました!! 早速試してみます。
お礼
どうもありがとうございます。 教えていただいた方法でうまくいきました! また何かあればよろしくお願いします!!