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

解決済みの質問

副問合せを使った複雑なUPDATE

はじめまして

テーブルAとBがあります

テーブルAをUPDATEする時にBのフィールドの値を使うのはわかるのですが

UPDATE A SET A.フィールド =
(SELECT B.フィールド FROM B WHERE Bの条件)

ここで、B.フィールドの値が'X'なら、そのまま代入。違う場合は'Y'を入れるような場合、1回のSQLで出来るでしょうか?

出来るのであれば、どのようなSQLか御教授願います。よろしくお願いします。

投稿日時 - 2008-08-12 13:12:55

QNo.4246056

困ってます

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

UPDATE A SET A.フィールド =
(SELECT decode(B.フィールド,'X',B.フィールド,'Y') FROM B WHERE Bの条件)
where Bの条件
;

とか

UPDATE A SET A.フィールド =
(SELECT case when B.フィールド='X' then B.フィールド else 'Y' end FROM B WHERE Bの条件)
where Bの条件
;

テーブルBに合致するレコードがない場合に、どうするか考えれて、SQLを書かねばなりません。
上記の例は、合致するレコードがなければ何もしないSQLです。

投稿日時 - 2008-08-13 02:14:16

お礼

ありがとうございました。

皆さんの回答を参考にさせていただきました

また、夏休み中にネット環境から離れていたためにお礼が遅くなったことをお詫びいたします。

投稿日時 - 2008-08-18 08:59:57

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

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

回答(3)

ANo.2

No.1です。NVLの位置まちがえました。

UPDATE A SET A.フィールド =
NVL((SELECT
(CASE WHEN B.フィールド='X' THEN B.フィールド ELSE 'Y' END)
FROM B WHERE Bの条件=Aのキー),'Y')

投稿日時 - 2008-08-12 18:27:16

お礼

ありがとうございました。

実際には条件が複雑なので、そのままとは行かず苦労しましたが、
おかげで解決できました。

また、夏休み中にネット環境から離れていたためにお礼が遅くなったことをお詫びいたします。

投稿日時 - 2008-08-18 08:58:13

ANo.1

できます。
Bに該当するものがない場合でもYを入れるにはNVLもかけておくと無難です。

UPDATE A SET A.フィールド =
(SELECT
NVL((CASE WHEN B.フィールド='X' THEN B.フィールド ELSE 'Y' END),'Y')
FROM B WHERE Bの条件=Aのキー)

投稿日時 - 2008-08-12 18:23:59