こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

複数のテーブルを参照して値を変更する方法

お世話になっております。
以下のようなテーブルがあったとして、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

投稿日時 - 2009-05-26 17:41:12

QNo.4992213

困ってます

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

横からですが、

>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

投稿日時 - 2009-05-27 14:16:34

お礼

どうもありがとうございます。

教えていただいた方法でうまくいきました!

また何かあればよろしくお願いします!!

投稿日時 - 2009-05-28 10:44:50

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

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 )

投稿日時 - 2009-05-27 02:59:20

お礼

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
などというようにできるものなのでしょうか?

投稿日時 - 2009-05-27 11:49:55

ANo.1

たとえば・・・

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

投稿日時 - 2009-05-26 18:10:52

お礼

どうもありがとうございました!!
早速試してみます。

投稿日時 - 2009-05-27 11:13:39

あなたにオススメの質問