dポイントプレゼントキャンペーン実施中!

テーブルがふたつあります。
片方のテーブル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で調べたのですが。。)
どなたかご教授いただけますか。

A 回答 (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/PostgreSQ …
辺りがヒントです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
たしかに、テーブル名を直で書くと動作しますね。

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

お礼日時:2006/12/19 12:58

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)

これでうまくいきました。
    • good
    • 0

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