ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.2610430 select結果でのupdate
質問者:jyunk テーブルがふたつあります。
片方のテーブルA(hoge1)のnameに、もう片方のB(hoge2)のnameをいれたいのです。
テーブルAとBはidでリレーションを張って、それぞれ対応する列にいれたいと思ってます。

tabale A hoge1
id | name | foo
----+-----+----
1 | 1111 | xxxx
2 | 2222 | yyy
3 | 3333 | zzzz

tabale B hoge2
id | name | bar
----+-----+---
1 | 1.net | 1
2 | 2.net | 0
3 | 3.net | 1

期待する結果
tabale A hoge1
id | name | foo
----+-----+----
1 | 1.net | xxxx
2 | 2.net | yyy
3 | 3.net | zzzz

Bに変更はなし

update hoge1 set name = b.name
from hoge2 b , hoge1 a
where a.id = b.id ;
とやるとname列が全て 1.netになってしまい

UPDATE hoge1 SET name = (select b.name from hoge2 b , hoge1 a where b.id = a.id ) ;
ERROR: More than one tuple returned by a subselect used as an expression.

とするとエラーです。(oracleならうまくいくとnetで調べたのですが。。)
どなたかご教授いただけますか。
困り度:
  • すぐに回答を!
質問投稿日時:
06/12/18 17:41
この質問に対する回答は締め切られました。

回答良回答20pt

ANo.2 すいません、補足です。
UPDATE hoge1 SET name = (select b.name from hoge2 b , hoge1 a where b.id = a.id ) ;
の何が悪いか、という点ですが、
副問い合わせの中で「hoge1 (AS) a 」としてるのに、最初にupdate hoge1 としてるのが
アウトとなるようです。ただこの場合、AS句のスコープも関係してきますので、
こういう場合は素直にテーブル名を書いたほうがよいです。
http://osb.sra.co.jp/PostgreSQL/Manual/PostgreSQL-7.4-ja/queries-ta...
辺りがヒントです。
回答者:tanshio2
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:
06/12/19 03:21
この回答へのお礼ありがとうございます。
たしかに、テーブル名を直で書くと動作しますね。

なるほど。ASのスコープが原因なのですね。。。。
結局今回はPGでやっちゃったのですが次回から使おうと思います。
ありがとうございました。

回答

ANo.1 hoge1 を test1
hoge2 を test2
hoge1.name を name1
hoge2.name を name2
に置き換えて読んでください。

update test1 set name1 = (select name2 from test2 where test1.id = test2.id)
where id = (select id from test2 where test1.id = test2.id)

これでうまくいきました。
回答者:tanshio2
種類:回答
どんな人:経験者
自信:自信あり
回答日時:
06/12/19 02:54
この回答へのお礼この回答にお礼をつける(質問者のみ)