質問 |
||
| 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 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |