- PR -

updateをキーでマッチしたレコードにかけたい

投稿者投稿内容
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2006-02-02 21:57
いつもお世話になります。db2です。
表題の件ですが、イメージ的にはこうです。

db2 => select * from t_up;

F_KEY F_DATA
----- ----------
1 ningen
2 ningen
3 ningen

db2 => select * from t_atai;

F_KEY F_DATA
----- ----------
1 gorira
3 kirin

上の二つのテーブルがあります。t_upに更新をかけたいのですが、
t_ataiテーブルと結合して、マッチしたレコードが書き換わって
ほしいのです。DB2ではできないといううわさも聞いていますが、
なんとかできそうな感じがしてなりません。

F_KEY F_DATA
----- ----------
1 gorira
2 ningen
3 kirin

結果としてこうなるのですが、where a.f_key=b.f_key
のような結合でやりたいですができないものでしょうか・・・。
ご存知の方がいらっしゃいましたらご教示願います。
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2006-02-03 09:59
自己レスです。

update t_up u set f_data=
(select a.f_data from t_atai a where u.f_key=a.f_key);

一応こんな感じでキーにマッチしたレコードに関しては
アップデートできるみたいです。
ただし、キーにマッチしなかったレコードが全てNULLに
なってしまうので問題かなー。
今回の場合はNULLなってもかまわないのでこれで解決ですが、
キーでマッチしなかったレコードを更新しない方法を
ご存知の方がいらっしゃいましたらぜひ教えていただきたいです。
閲覧、思案いただいた皆様に御礼申し上げます。
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2006-02-03 11:20
私はDB2を触ったことはありませんが・・・

コード:
update u set 
  u.f_data = a.f_data
from t_up u
  inner join t_atai a on u.f_key = a.f_key


マッチしたレコードだけを書き換えるっていうとこんなかんじのSQLになると思いますが、DB2だとムリなんでしょうか?
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2006-02-03 15:13
かためろさんご返答ありがとうございます。

引用:


コード:
update u set 
  u.f_data = a.f_data
from t_up u
  inner join t_atai a on u.f_key = a.f_key


マッチしたレコードだけを書き換えるっていうとこんなかんじのSQLになると思いますが、DB2だとムリなんでしょうか?



自分の環境で試してみたのですが、できないっぽいです。

db2 => update u set u.f_data = a.f_data
from t_up u
inner join t_atai a on u.f_key = a.f_keydb2 (続き) => db2 (続き) => ;
DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
ステートメントとして処理されました。 SQL
処理中に、そのコマンドが返されました。
SQL0204N "TAKE.U" は未定義の名前です。 SQLSTATE=42704

SQLServerだとかためろさんのSQLでいけるらしいですね。
私が自己レスでアップしたコードしか使えないのでしょうか。
けっこう融通が利かないんですよね。っていうか使い方知らないだけか(苦笑)
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2006-02-03 15:52
こんな感じですかね。
update t_up u set f_data=
(select a.f_data from t_atai a where u.f_key=a.f_key)
where exists(select * from t_atai a where u.f_key=a.f_key)


[ メッセージ編集済み 編集者: Anthyhime 編集日時 2006-02-03 15:52 ]
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2006-02-03 17:58
Anthyhimeさんご返答ありがとうございます。

引用:

Anthyhimeさんの書き込み (2006-02-03 15:52) より:
こんな感じですかね。
update t_up u set f_data=
(select a.f_data from t_atai a where u.f_key=a.f_key)
where exists(select * from t_atai a where u.f_key=a.f_key)




ビンゴでした!
そうですか、existsですか。思いつかなかったです。
おみそれしました。やっぱりこれができないと処理がうまくいかない
ことに気づいてあせってたとこでして、かなり助かりました。
何とか帰れそうです。ありがとうございました。
せん
ぬし
会議室デビュー日: 2002/03/04
投稿数: 397
投稿日時: 2006-02-03 18:40
引用:

おみそれしました。


(1)会っても気づかなかったり、だれであるか思い出せなかったりした時に言う語。
「これは―しました」

(2)相手の能力・技量などをみそこなっていたことをわびる気持ちを表していう語。
「見事なお手並み、―しました」
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2006-02-03 23:18
引用:

せんさんの書き込み (2006-02-03 18:40) より:
引用:

おみそれしました。


(1)会っても気づかなかったり、だれであるか思い出せなかったりした時に言う語。
「これは―しました」

(2)相手の能力・技量などをみそこなっていたことをわびる気持ちを表していう語。
「見事なお手並み、―しました」



私も、初めて意味を知りました。
でも、質問者は意味を知らずに、尊敬の意味を込めて使ったと思いますよ。
使い慣れないけど、よく聴く言葉ってのは難しいですね〜。

スキルアップ/キャリアアップ(JOB@IT)