- PR -

SELECT結果でのUPDATE

1
投稿者投稿内容
トロ
会議室デビュー日: 2005/01/23
投稿数: 10
投稿日時: 2005-01-23 02:06
いつも参考にさせていただいています。

複数カラムを取得するSELECT結果でのUPDATEをしたいと思っています。
で、下のようなSQLを考えてみましたが、先輩にこれじゃダメだと言われてしまいました。
結果を見る限りでは大丈夫そうなんですが。

コード:
update テーブルA A

set (A.所属,A.住所,A.電話番号)
= (select B.所属,B.住所,B.電話番号 from テーブルB B where A.ID = B.ID);


私には何が問題か分からなかったので別の先輩に相談した所、下記のSQLを教えてくれました。

コード:
update テーブルA A

set A.所属 = (select B.所属 from テーブルB B where A.ID = B.ID)
A.住所 = (select B.住所 from テーブルB B where A.ID = B.ID)
A.電話番号 = (select B.電話番号 from テーブルB B where A.ID = B.ID)
where A.ID = (select B.ID from テーブルB B where A.ID = B.ID);


先輩は、テーブルAとちゃんとIDでつながないと正しく動作しないから
こうした方が言いと言いました。

そこでみなさんに質問です。

  1. 私の考えたSQLのどこが問題なのか。
    (このSQLもA、BテーブルをIDでつないでると思うのですが...)
  2. 先輩の教えてくれたSQLは、1つ1つのカラムにIDでつないでいてとても無駄な感じがします。
    みなさんはどう思うのか。


以上、よろしくお願いします。

Oracle9iを使用しています。

[ メッセージ編集済み 編集者: トロ 編集日時 2005-01-23 02:17 ]
前川
常連さん
会議室デビュー日: 2004/04/27
投稿数: 38
お住まい・勤務地: 1DK
投稿日時: 2005-01-23 03:24
UPDATE文自体のWHERE句が無いので、Aに存在するIDがBのテーブルに見つからない場合、そのIDを持つAのレコードがNULLで更新されます。
そういう仕様なら問題ありませんが、もしこれを避けたければ

コード:
update テーブルA A
 set (A.所属,A.住所,A.電話番号)
   = (select B.所属,B.住所,B.電話番号 from テーブルB B where A.ID = B.ID)
where exists (select 1 from テーブルB B where A.ID = B.ID);


とする必要があります。 # …多分。今実験できないので推測です。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2005-01-24 09:23
るぱんです。

ちゃんと主キーがあって(ID)、
それで一意になっているなら問題は起こらなさそうです。

でも、僕が上の立場で下の人を教えるのであれば
同じことをしますね。

SQLのコードを書く手間を惜しんで、
どんな状況にでも対応できるコードが書けないとなると、
問題になりはしないですかね?<あとあと
前川
常連さん
会議室デビュー日: 2004/04/27
投稿数: 38
お住まい・勤務地: 1DK
投稿日時: 2005-01-24 09:47
確認しました。やはりBのテーブルにIDが足りない場合はNULLで更新されます。

というわけで、
  • IDがユニークになっている(もしくはアプリ/運用上で同種の保証がされている)
  • A→Bの外部キー制約が有る(もしくはアプリ/運用上で同種の保証がされている)
この条件を満たしていない場合、トロさんのSQLではNULLで更新されるレコードができます。
そういう動作が正しければトロさんが正解、誤りなら先輩が正解…
なんですが、その先輩の教えたSQLはちょっとどうかと…
トロ
会議室デビュー日: 2005/01/23
投稿数: 10
投稿日時: 2005-01-24 10:40
回答をくださった方、ありがとうございました。

前川さんの教えてくださった、
コード:
update テーブルA A
 set (A.所属,A.住所,A.電話番号)
   = (select B.所属,B.住所,B.電話番号 from テーブルB B where A.ID = B.ID)
where exists (select 1 from テーブルB B where A.ID = B.ID);


で先輩からOKがもらえました。

土曜に休日出勤して丸1日考えたのに分からずとっても困っていたので、本当に助かりました。
また分からない事があったら質問すると思います。
その時は、よろしくお願いします。
1

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