mysql:6133
From: "梅村繁実" <"梅村繁実" <umemura@xxxxxxxxxx>>
Date: Thu, 12 Sep 2002 09:47:56 +0900
Subject: [mysql 06133] Re: 他テーブルのデータでアップデート
山下さん、遠藤さん、菅原さん、川合さん、とみたさん はじめまして、梅村です、皆さんご教授有難う御座います。 >> 山下さんは書きました > 以下のようなSQL文を発行するのが「筋」らしいです。 > ===================================================== > update codemaster set EDP_Code=temp.EDP > where ID=(select ID from temp); > ===================================================== > # 上の式があってるかどうかは保証の限りではありません(汗)。 ↑検証したところやはりエラーが帰ってきました You have an error in your SQL syntax near 'select ID from temp)' at line 2 > しかし、「村上、立岡著 MySQL活用ガイド 株式会社秀和システム」の > 7ページにMySQLの現行バージョンには「副問い合わせ」が存在しない > という記述がありました。 > したがって、現状ではアプリケーション側で反復処理(loop)などで > 対応するしかないと思われます。 なるほど、tempテーブルのIDとEDPを先に抽出してスクリプト内の配列に格納してか ら loop内で配列回数文updateするという事ですね。 やってみます。 ------------------------------------------------------- >>菅原さんは書きました > 副問い合わせの一種に違いないと思いますが、こういうケースはデータベース > によってSQLの書き方が違うようです。 > MS SQLServerでは > UPDATE codemaster SET EDP_Code = temp.EDP > FROM temp WHERE codemaster.ID = temp.ID > のようになるらしいです。 > 副問い合わせなら > UPDATE codemaster SET EDP_Code = ( > SELECT temp.EDP FROM temp, codemaster > WHERE temp.ID = codemaster.ID) > になるような気がしますが、UPDATE文にWHERE句を書かなくても良いのか気にな > るとこです。 此方も試してみましたがやはり次のように構文エラーと帰ってきました You have an error in your SQL syntax near 'SELECT temp.EDP FROM temp, codemaster WHERE temp.ID = codemaster.ID)' at line 1 > まあ、MySQLはまだ副問い合わせが使えないですし(4.1で実装予定らしい)、 > ドキュメントの「近い将来に完了せねばならないもの」の中に > > UPDATE items,month SET items.price=month.price > WHERE items.id=month.id; > > ってのがありますんで、それまで待たなくてはいけないです(これは4.1よりさ > らに後みたいですね……)。 なるほど、、私の使ってるバージョンでは未対応なのか。 ------------------------------------------------------------------- >> 川合 孝典 さんは書きました > ただテーブルを作るといっても一時テーブル(TEMPORARY TABLE)であれば、 > コネクション単位に作成されますし、コネクションが切れると自動的に削除され > ますから、通常にテーブルを作ることを考えるよりは、安心して使える思います。 そうなんですか、Replaceコマンドは勉強してませんでしたので、どんどんテーブル が 作成されて、手動で削除しないといけないと思ってました^^; > CREATE TEMPORARY TABLE tmp_code > SELECT temp.ID, temp.EDP, MST.sonota > FROM temp INNER JOIN codemaster MST ON temp.ID=MST.ID; > > REPLACE codemaster(ID, EDP_code, sonota) > SELECT * FROM tmp_code; > > mysql> SELECT * FROM codemaster; > +----+----------+----------+ > | ID | sonota | EDP_Code | > +----+----------+----------+ > | 1 | SONOTA:1 | MSTER:1 | > | 2 | SONOTA:2 | TMP:2 | > | 3 | SONOTA:3 | MSTER:3 | > +----+----------+----------+ 此方も、後で挑戦してみたいと思います、同じ結果を得られるのであれば、処理速度 の速いほうを 選んで、実装しようと思います。 --------------------------------------------------------------------- > とみたです。 > ところがどっこい、4.0.2 で使えるようになってるみたいです。 > > Changes in release 4.0.2 > ------------------------ > 〜中略〜 > * First pre-version of multi-table `UPDATE' statement. そうなんですか、そしたら早々にリリースされてるMySQL 4.0 -- beta release をダ ウンロードして 見ます。確か4.0.3でしたよねbeta release 副問い合わせが出来るか試してみます。 最後に、こんな返信の仕方で大丈夫ですか?それぞれの方のメールに返信したほうが 良かったのでしょうか? 本題とは違いますが、MLの使い方の(マナー的なもの)がおかしかったらご指摘くだ さい。 皆さん、有難うございました。
6113 2002-09-11 12:52 ["梅村繁実" <umemura@] 他テーブルのデータでアップデート 6124 2002-09-11 16:22 ┣["Takashi Yamashita" ] 6126 2002-09-11 17:05 ┃┣[SUGAWARA Hajime <sug] 6132 2002-09-11 23:44 ┃┃┗[とみたまさひろ <tomm] 6140 2002-09-13 22:11 ┃┃ ┗["umemura" <shigemi.u] 6141 2002-09-14 00:54 ┃┃ ┗[ふぁんく <freeml@xxx] 格納データ型について 6142 2002-09-14 01:45 ┃┃ ┣[<miffyz@xxxxxxxxxx> ] 6147 2002-09-14 21:37 ┃┃ ┃┗[<freeml@xxxxxxxxxx> ] 6144 2002-09-14 19:26 ┃┃ ┗[とみたまさひろ <tomm] -> 6133 2002-09-12 09:47 ┃┗["梅村繁実" <umemura@] 6134 2002-09-12 10:14 ┃ ┗["Takashi Yamashita" ] 6125 2002-09-11 17:03 ┣[遠藤 俊裕 <endo_t@xx] 6127 2002-09-11 17:11 ┃┗[遠藤 俊裕 <endo_t@xx] 6130 2002-09-11 18:02 ┗["KAWAI,Takanori" <GC]