MySQLバージョンが古く、副問い合わせが使えない場合に、テーブルAのnameをテーブルBから取得してUPDATEする方法

このQ&Aのポイント
  • MySQLバージョンが古く、副問い合わせが使用できない状況で、テーブルAのnameをテーブルBから取得してUPDATEする方法を教えてください。
  • テーブルAとテーブルBがあり、Aのname列が初めはNULLです。AのidのうちBにマッチするもののnameをBから取得し、Aにコピーしたいのですが、副問い合わせが使えず方法がわかりません。
  • 古いバージョンのMySQLを使用しているため副問い合わせが使用できず、テーブルAのnameをテーブルBから取得してUPDATEする方法を教えてください。
回答を見る
  • ベストアンサー

副問い合わせを使わずに書く方法

テーブルAとBがあり、どちらも列idとnameがあります。Aのnameは最初はNULLです。AのnameをBから持ってきてUPDATEしたい(AのidのうちBにあるもののnameをAにコピーする)のですが、MySQLのバージョンが古く、副問い合わせが使えず、以下のようなことができないので困っています。どなたか教えていただけませんか。 UPDATE A SET name = ( SELECT name FROM B WHERE A.id = B.id ) WHERE EXISTS ( SELECT 'X' FROM B WHERE A.id = B.id ) ;

  • MySQL
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

aとbのidが同じで、nameが違う場合どうするかによって多少処理がかわってきますが とりあえずはテンポラリを使えばよいでしょう。 以下、nameが違う場合は更新しない例。 CREATE TEMPORARY TABLE `temp_b` SELECT `b`.`id`,`b`.`name` FROM `b` INNER JOIN `a` ON `a`.`id`=`b`.`id` AND `a`.`name`IS NULL; REPLACE `a` SELECT `id`,`name` FROM `temp_b`;

qryoec
質問者

補足

解答ありがとうございます。試してみます。なお、AのnameはNULLです。したがって、nameはAとBで必ず異なり、BのnameでAのnameの空欄(NULL)を埋める形になります。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

ああ、NULLの場合だけ書き込めばいいんですね。 なら前述の通りで良いと思います。 Aにいないで、Bにいる人とかは気にしなくてよいですか? ちなみにREPLACEは全項目書き換えなので、 id,name以外にもフィールドがあるなら、それを想定して SQLを発行してやる必要があります

qryoec
質問者

補足

再びありがとうございます。AにいないでBにいる人はいません。Aのnameは最初は必ずNULLです。そこにBからnameをコピーしたいのです。 ちょっと考えてみて以下の方法でよさそうなのですが、問題あるでしょうか。UPDATEでJOINを使ったことはないのですが。 UPDATE A JOIN B ON A.id = B.id SET A.name = B.name ;

関連するQ&A

  • distinct をexistsに変換する

    distinctをexistsに変換した方がパフォーマンスが良いようで、 例えば以下の例があるとします ---------------------------------- (前)SELECT DISTINCT a.ID1, a.NAME1 FROM TABLE1 a, TABLE2 b WHERE a.ID1 = b.ID2 (後)SELECT a.ID1, a.NAME1 FROM TABLE1 a    WHERE EXISTS ( SELECT 'X' FROM TABLE2 b WHERE a.ID1 = b.ID2) ---------------------------------- もっと複雑なSQLの場合、EXISTSに変換できるのでしょうか?。複雑なSQLとは、 「複数のテーブルからカラムを取得」「テーブル結合が2つ以上」「外部結合」 などのSQLで、以下に例を示します。 (例)SELECT DISTINCT a.ID1,a.NAME1,b.ID2,b.NAME2,c.ID3,c.NAME3    FROM TABLE1 a,TABLE2 b,TABLE3 c    WHERE a.ID1 = b.ID1(+)      AND a.ID1 = c.ID1(+)

  • 副問い合わせ

    UPDATE `hoge` SET `area` = ( SELECT area FROM `hogeArea` WHERE `code` = "001000" ) WHERE `code` = "000019" AND `type` = "02"; 上記のようなUPDATEは無理ですか? MySQLは副問い合わせは無理でしょうか?

  • 副問合せをするとエラーになってしまいます

    お世話になります PHP+MySQLにて開発しています あるテーブル1とテーブル2を使って テーブル1のデータを列挙したいのですが うまく行かずエラーが出てしまいます 構造は以下のようになっています ----------------- テーブル1 ----------------- ID  DATE  MEMO 0   3/24   aaa 2   3/25   ccc ----------------- テーブル2 ----------------- ID   BUNRUI 0   A 1   B 2   A テーブル2のBUNRUIが'A'の行のID(上で言うと0と2)を テーブル1のID検索条件にして、 かつDATEが'3/24'の行を取得したく思っています 書いたSQL文は SELECT * FROM テーブル1 WHERE date='3/24' AND id IN(SELECT id FROM テーブル2 WHERE bunrui='A') です。 結果としてテーブル1のID=0 DATE=3/24 MEMO=aaa が取れると良いのですが... 「SELECT id FROM テーブル2 WHERE bunrui='」 が不正とエラーが出てしまいます (判り難い説明で申し訳無いです…) 宜しくお願いします

    • ベストアンサー
    • MySQL
  • UPDATE文(副問合せ?)について

    うまく説明できないのですが、下記のようなテーブルがあります。 テーブル名:A 項目: A1 A2 A3 A4 AテーブルのA1項目に「5」がセットされているデータについて、 A2に123、A3に321をセットしたいのです。 うまくいかない例ですが、下記のようなイメージです。 UPDATE A set A2=123,A3=321 FROM (SELECT * FROM A WHERE A1 = '5') ちなみに下の書き方はダメです。 「SELECT * FROM A WHERE A1 = 5」の部分は、必ず使用し、変更不可です。 × UPDATE A set A2=123,A3=321 WHERE A1 IN(SELECT A1 FROM A WHERE A1 = 5) 変な質問ですいませんが、何か方法があるのでしょうか。 よろしくお願いします。

  • select結果でのupdate

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

  • テーブル結合で、結合フィールドをWHERE句に用いた時に、結合フィールドのデータがNULLになってしまう。

    MySQL 4.0.24-standard + PHP Version 4.3.11 を使用しています。 下記のような table_a, table_b があり、idフィールドで外部結合させています。 table_a id|value ------- 1 | 0 2 | 1 table_b id|name ------- 1 | A 2 | B SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b; result id|value|name -------------- 1 | 0 | A 2 | 1 | B しかし、下記のクエリでは、このようにidがNULLになってしまいます。 SELECT * FROM table_a NATURAL LEFT OUTER JOIN table_b WHERE table_a.id = 1; result id |value|name -------------- NULL| 0 | A 以下のような結果を得たいのですが、どうすれば良いのでしょうか? result id|value|name -------------- 1 | 0 | A

    • ベストアンサー
    • MySQL
  • 複雑な条件下におけるupdate文について

    sqlserver(2008R2)についてクエリ文が上手く書けません。 お手数をおかけいたしますが、お分かりになる方はご教授いただければと 思います。 まず、元となるテーブルおよび作成したい完成系は添付ファイルをご確認下さい。 personal_id、personal_name、personal_address、personal_tel、personal_date列を 持つテーブル(personal_table)から 「select * into #table01 personal_table」に よって一時テーブル#table01を作成し、personal_name・address・telがnullの場合に、 personal_dateが直前時におけるnull以外の値をセットしたいと思っています。 (ただし、セットするのはpersonal_id毎で、最もpersonal_dateが若い者には 必ずpersonal_name・address・telが入っているものとします)。 なお、以下は私が作成したクエリになります。 項目1つずつっと思い、 とりあえずpersonal_nameをpersona_idおよびpersonal_dateを用いて updateしようと思ったのですが、personal_nameがすべてnullになってしまいました。 --------------------------- select * into #table01 from personal_table update #table01 set personal_name = (select personal_name from #table01 A where #table01.personal_id = A.personal_id AND #table01.personal_date = (select MAX(A.personal_date) from #table01 A where #table01.personal_date > A.personal_date AND #table01.personal_id = A.personal_id)) SELECT * from #table01 --------------------------- 完成系を作成するにあたってどのようなクエリを書けばよろしいのか、 ご教授いただければと思います。

  • SQL文 テーブルの作成方法について

    以下のようなTABLE1からTABLE2というテーブルを作成したいと考えております。 元テーブル(TABLE1)は、IDという項目がキーとなってデータが入っており、NAME1とNAME2という項目があります。 (NAME1は必ず値が入っていますが、NAME2は値が入っていない場合もあります) 加工後のテーブル(TABLE2)で、NAME1とNAME2の値を結合した形で結果を出力したいと考えております。 (新たに作成したNAMEカラムは、必ずしもユニークになっているとは限りません。NAMEとIDを組み合わせるとユニークになります) ---------------------------------------------------- ■ TABLE1 ID NAME1 NAME1_CATE NAME2 NAME2_CATE ---------------------------------------------------- 001 鈴木 A 山田 B 002 山本 A 003 佐藤 A 高橋 B ---------------------------------------------------- ---------------------------------------------------- ■ TABLE2 ID NAME NAME_CATE ---------------------------------------------------- 001 鈴木 A 001 山田 B 002 山本 A 003 佐藤 A 003 高橋 B ・・・ ---------------------------------------------------- いろいろ試していますが、どのようなSQL文を書いたらよいのか分かりません。 現状のSQL(エラーとなります) ====================================================================================== SELECT ID, NAME, NAME_CATE FROM (SELECT ID, NAME1 as NAME, NAME1_CATE as NAME_CATE FROM TABLE1 WHERE NAME1<>NULL) JOIN (SELECT ID, NAME2 as NAME, NAME2_CATE as NAME_CATE FROM TABLE1 WHERE NAME2<>NULL) ====================================================================================== 初歩的な質問になるかと思ってしまうかと思いますが、よろしくお願いいたします。

  • 副問い合わせの限界値はどれくらいなのでしょうか? 

    副問い合わせの限界値はどれくらいなのでしょうか?  現在下記のようなSQLを考えています。 SELECT * FROM A_TABLE WHERE a_field in ( SELECT a_field FROM B_TABLE WHERE b_field := ?c ) ; ※(便宜上、外部変数の指定を[:= ?c]としました) B_TABLEの検索に引っかかったデータをinの条件にしてA_TABLEを検索するのですが、 B_TABLEの検索で出力される結果(サブクエリで出力される件数)が 現在の理論値は平均でおおよそ1000件、最大10万件になる予定です。 これに対し、10万件での問い合わせに副問い合わせの実行はmysqlで可能なのでしょうか?  現状のテスト環境では10万件のテストデータを用意できない状況です・・・。 また、どなたか副問い合わせでのサブクエリ出力件数の限界値をご存知の方がいらっしゃいましたらご教授頂ければ幸いです。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • データが存在しないか条件に一致する場合の条件文

    bテーブルにc=a.cのデータが存在しない、あるいはc=a.cに一致するフィールドdの時刻が10分経過している場合にUPDATEを実行するクエリを考案中です。ベタ書きすると以下のようになると思うのですが、同じSELECT文が2回出てきます。これらをまとめることは可能でしょうか。 UPDATE a SET foo=? WHERE id=? AND (NOT EXISTS(SELECT d FROM b WHERE c = a.c) OR TIMEDIFF((SELECT d FROM b WHERE c = a.c), NOW()) > '00:10:00');

    • ベストアンサー
    • MySQL