「みんな教えて! 選手権!!」開催のお知らせ

(TBL_A)
A1  A2
-----------
1  100
2  200
3  300
4  400
5  500


(TBL_B)
B1  B2
-----------
1  100
3  300
4  400


上記のようなテーブルAとBがあったとして
次のようなUPDATE文を実行することはできますか?
できない場合、SQL1発で更新する他の方法はありますでしょうか?

UPDATE TBL_A A SET
A.A1 = A.A1 + B.B1
A.A2 = A.A2 + B.B2
WHERE EXISTS
(SELECT 'X' FROM TBL_B B WHERE A.A1=B.B1)

【更新後のTBL_A表】
A1  A2
-----------
1  200 <= (*)更新される
2  200
3  600 <= (*)更新される
4  400
5  1000 <= (*)更新される

【やりたいこと】
TBL_A表のA2列のデータにTBL_B表のB2列のデータを加算したい。
その場合の更新条件として「A1がB1に存在している場合のみ」という条件を加えたいのです。

すいませんが、よろしくおねがいします。

A 回答 (2件)

>次のようなUPDATE文を実行することはできますか?


エラーになり実行できないと思いますがどうですか???
SET文に、
A.A1 = A.A1 + B.B1
と書いても、「B.B1」がなんのことか、DB側には分かりません。

EXISTSはあくまで、「Bに存在する行を」という更新の対象の行を絞る条件にしかならないので、
SET文でBのB1値を使いたいなら連結しなくてはいけません。

副問い合わせにしたらいかがですか?
UPDATE TBL_A A
SET A.A2 =
(SELECT A.A2 + B.B2 FROM TBL_B B
WHERE A.A1 = B.B1)
WHERE EXISTS
(SELECT * FROM TBL_B B WHERE A.A1=B.B1)

こんなかんじです。
ちなみにEXISTS文なりなんなりの「A1がB1に存在している場合のみ」
というWhere句は必要です。
上記のSQLにEXISTS文がない場合、
Bに存在しないAの行(A1が2と5の場合)もUPDATE文の対象となり、
Bとの連結の結果がNULL値になるので、
その行のA2の値がNULLで更新されてしまいます。
NULL値の加算はNULLだからです。
↓以下のようになります。

A1  A2
-----------
1  200
2  Null
3  600
4  800
5  Null

あまり意味がわからないかもしれませんが、
とりあえず、簡単なテーブルでも作って、
試してみてはいかがでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございます。参考になりました。
テーブルを作って試して見ます!

お礼日時:2006/09/22 10:28

>次のようなUPDATE文を実行することはできますか?



という問いに対しては、
update TBL_A
set
A1=A1 + (select B1 from TBL_B where A1=B1),
A2=A2 + (select B2 from TBL_B where A1=B1)
where A1 in (select B1 from TBL_B);
で書けますが・・

>【やりたいこと】
>TBL_A表のA2列のデータにTBL_B表のB2列のデータを加算したい。
>その場合の更新条件として「A1がB1に存在している場合のみ」という条件を加えたいのです。

に沿ったSQLを書くなら・・

update TBL_A
set
A2=A2 + (select B2 from TBL_B where A1=B1)
where A1 in (select B1 from TBL_B);

で良いはずです。

なんで、A1へB1を加算するようなSQLを書くのか理解できません。
また、更新後のTBL_Aのサンプルも、【やりたいこと】とは
一致していません。(A1=4 および 5 に対する結果)
    • good
    • 0
この回答へのお礼

ありがとうございます。
確かに質問内容がグダグダでした。。。
これからは気をつけます。

お礼日時:2006/09/22 10:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報