複数のテーブルをJOINして更新する方法

このQ&Aのポイント
  • 複数のテーブルをJOINして更新する方法について説明します。
  • 複数のテーブルのデータを結合して、UPDATE文を使用して更新する方法です。
  • 具体的なSQL文の例を示し、利用環境についても記載します。
回答を見る
  • ベストアンサー

複数のテーブルをJOINして更新する方法

複数のTABLEをJOINさせてアップデートをしたいと思っています。 TABLE1とTABLE2のCODEはJOINができます。 TABLE1とTABLE3のJANはJOINができます。 TABLE2にはJANフィールドがありません。 TABLE3のSTOCKをTABLE2のSTOCKに代入したいと思います。 以上の条件により下記のSQLを作って見ました。 UPDATE (TABLE1 INNER JOIN TABLE2 ON TABLE1.CODE = TABLE2.CODE) INNER JOIN TABLE3 ON TABLE1.JAN = TABLE3.JAN SET TABLE2.STOCK = TABLE3.STOCK WHERE TABLE1.FLAG=0 本を読んでみると、SELECT文による複数のテーブルからデータを引っ張ってくる例は載っているのですが、複数のTABLE情報を元にUPDATEする例は載っていませんでした。上記のようなコードはあっているでしょうか?利用している環境はWin XP Pro、MYSQL 5.5です。 よろしくお願いいたします。

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

文法上は正しいのですが、結合したテーブルを 更新する場合、1:1 または 1:n のn側が更新 可能です。逆の更新はMySQLではOKですが、 DBシステムによっては実行時エラーになります。 例え実行可能でも、1個のフィールドに複数個の 値を入れようとするのですから結果が不定です。 ということはTABLE3はJANがUniqueでなければ ならず、TABLE1は同じCODEで異なるJANの 組合せが無いことが条件になるので、CODEが Uniqueになっていなければなりません。 この条件を満たさないと、実行する度に結果が 異なると言う不具合を生じます。 一般にテーブルを結合したものは更新可能である 可能性が低く、可逆性や再実行性も悪いので、 考えません。TABLE1とTABLE3から更新用の テーブルを作成し、これとTABLE2を結合して 更新するか、更に置換用テーブルを作成して からTABLE2の値を入れ替える手順を考えます。

mellow91
質問者

お礼

ご回答ありがとうございます!文法的に正しいということで勇気づけられました!1:1でCODE、JANともにユニークです。 テンポラリのテーブルを用いてやるのが良いのですね。参考になります。ありがとうございます。!

その他の回答 (2)

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

余計なお世話ですが気になるところをいくつか・・・ (1)MySQLだけの話ならMySQL板があります (2)正規化の手法としてはテーブルに埋め込む商品を特定するidは一義なものを 使うべきかと とくに他の回答者からもあるように1:1以外のデータがあると整合性に欠けます。 (3)STOCKを複数のテーブルで管理する意義はあるのでしょうか? またTABLE1のフラグが立ってなければ同期するというロジックがわからないです。 普通考えればSTOCKはストック用のテーブルに商品IDと数量をいれておくものだと 思うのですが・・・

mellow91
質問者

お礼

ご回答ありがとうございます!SQLの文についてうかがいたかったので、その他の板に投稿しました。 基本的に1:1です。複数のテーブルで管理するのは色々な都合があって・・・不思議に思われるのはもっともなのですが、複雑な理由でこうなっています。 ご回答ありがとうございました!

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

http://dev.mysql.com/doc/refman/5.1/ja/update.html に複合テーブルのUPDATE文が載っています。 UPDATE TABLE1,TABLE2,TABLE3 SET TABLE2.STOCK = TABLE3.STOCK WHERE TABLE1.FLAG=0 AND TABLE1.CODE = TABLE2.CODE AND TABLE1.JAN = TABLE3.JAN; としたらどうでしょうか。 ただ、 http://hyun-jae.cocolog-nifty.com/blog/2007/06/mysqlupdate_f32c.html http://www.abe-tatsuya.com/web_prog/mysql/update_inner_join.php このあたりをみると質問に記載のようなSQLでも大丈夫そうな気がしますけどね。 MySQLの環境が無く試すことができないのでよくは分かりませんが、 カッコをつけているのがいけないのかもしれません。

mellow91
質問者

お礼

ご回答ありがとうございます!SQLは動作はするんですが、ほんとにこんな文法で大丈夫なのかな!?とおもって伺いました。リンクを見てみましたら、参考になるSQL文がありましたので勇気づけられました。ありがとうございます!

関連するQ&A

  • left outer joinで抽出したい

    SELECT (TABLE1 INNER JOIN TABLE2 ON TABLE1.CODE = TABLE2.CODE) INNER JOIN TABLE3 ON TABLE1.JAN = TABLE3.JAN というSQL文があります。この文を変更して下記の条件での抽出をおこないたいと思います。 ■TABLE1.JANを元にする。 ■TABLE1.JAN = TABLE3.JANは抽出に含めない ■TABLE1.JANに存在していて、TABLE3.JANに存在しないJANをTABLE1.JANから抽出 このようなSQL文をかきたいのですが、どのようなSQL文にしたらよいでしょうか? left outer joinを使えばいいとは思うのですが、そこから先が思い浮かびません。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • WHERE句で結合。INNER JOINとの違い

    MySQLで複数テーブルからデータ取得する際、 FROMの後に、テーブル名を2つ書いて、「WHERE」で繋げる書き方と、 「JOIN ★★ ON」で繋げる書き方では、何が違うのでしょうか? ・「INNER JOIN」と同じ意味でしょうか? ・書き方によっては、「LEFT OUTER JOIN」みたいにも書けるのでしょうか? ・普通は、どちらの書き方で書くとか、そういうお作法的な暗黙の了解はあるでしょうか? ・例えば「WHERE」だと3つ以上繋げられない(?)から、奨励されていない、とか…

    • ベストアンサー
    • MySQL
  • inner joinについて

    SQLのデータ抽出方法についてお教え下さい。 TABLE_2をdistinctで重複を無くして、TABLE_1とinner joinさせたいです。 select distinct TABLE_2.id と select TABLE_1.ID from TABLE_1 inner join distinct TABLE_2.ID といったようなことをやりたいです。 TABLE_1 ID 001 001 002 002 002 TABLE_2 ID 001 001 002 002 002 環境はMYSQL5.5になります。よろしくお願いいたします。

  • 結合が上手くいきません

    以下のテーブルがあるとします table1 名前|住所コード|勤務地コード table2 コード|名称 テーブル1の検索結果にテーブル2の名称を引っ張ってきて取得したいのですがどうやるのでしょうか? SELECT * from table1 INNER JOIN table1.住所コード ON table2.コード INNER JOIN table1.勤務地コード ON table2.コード これではうまくいきませんでした。 SELECT (select 名称 from table2 where table2.コード=table1.住所コード),(select 名称 from table2 where table2.コード=table1.勤務地コード) FROM table1 これは上手くいくのですが重いらしいので、、、

    • ベストアンサー
    • MySQL
  • inner joinをすると数がおかしくなります

    SQLのinner joinについてお教え下さい。環境はWin 7 MYQL5です。 t1テーブルのデータ ID,在庫 001,22 t2テーブルのデータ ID,出庫 001,17 001,3 SELECT Sum(t1.stock) AS `在庫` FROM t1 where id = '001' 上記SQLの結果は22と表示されます。 SELECT Sum(t1.stock) AS `在庫` FROM t1 INNER JOIN t2 on t1.id = t2.id where id = '001' とやると、結果が44になってしまいます。 なぜそんな結果になってしまうのでしょうか? 結果はt1.stockは在庫22なので、22と表示するようにしたいです。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • テーブルの集計値を別テーブルに更新したいのですが

    mysql+PHPを利用していますが、表記の件で数日間悩んでおります。 実際に可能な操作かどうかもわかりません。 よいお知恵があったら教えてください。 下のようなテーブルがそれぞれあります。 table1 ID・得意先コード・受注内容・受注金額 1・   28  ・ xxxx ・ 10000 2・   32  ・ aaaa ・  5000 3・   28  ・ YYYY ・ 20000 4・   15  ・ tttt ・ 15000 5・   32  ・ kkkk ・  3000 (得意先コードはtable2のIDです) table2 ID・得意先名・受注金額合計 15・ BBB・ 28・ CCC・ 32・ DDD・ PHPファイルを実行する度に、 「table1」の「受注金額」を「得意先コード」ごとに集計した各値を、「table2」の各「受注金額合計」にそれぞれ更新していきたいと思っています。 色々調べたところ以下の構文が紹介されていたので試してみました。 Update table2 set 受注金額合計 = (select sum(受注金額) from table1 INNER JOIN table2 ON table1.得意先コード = table2.ID) すると「#1064 - You have an error in your SQL syntax」というエラーが出てしまいました。select以降の構文が良くないらしいのですが、私の書き方が悪いのか、それすらもわからない状態です。 MySQLは4.0.24、PHPは4。レンタルサーバーを利用しています。 なにとぞよろしくお願いします。

  • SQLでSELECTした一覧をUPDATEする方法を教えてください。

    AのテーブルをINNER JOINのWHERE文を用いて、selectした結果の項目にBテーブルの内容をUPDATEしたいのですが、 下記方法でうまくいきません。 解決方法を教えてください。 よろしくお願いいたします。 SELECT A.PointZan FROM A INNER JOIN B ON A.Code = B.Code WHERE (B.TrDate = '091012') AND (B.Comment = '失効中止') UPDATE A SET PointZan = (SELECT B.PointZan FROM B INNER JOIN A ON B.Code = A.Code WHERE (B.TrDate = '091012') AND (B.Comment = '失効中止'))

  • 複数テーブルのUPDATE

    タイトルの通り、複数テーブルのUPDATEを行いたいと思っています。 私なりには、以下のようなコードでテーブルを作成しようとしましたが、作成できませんでした。 エラー内容としては、 update table_1, table_2 SET のtable_1, が間違ってます的なエラーでした。 update table_1, table_2 SET table_1.updatetime=getdate(), WHERE table_1.SeqNo = table_2.SeqNo AND table_1.SeqNo = @SeqNo 以上、緊急の内容であったため、十分調べていない点があるかもしれませんが、何卒、ご存知の方ご教授お願い致します。

  • JOINで複数の表をまとめる場合の書き方

    質問させてください。 SQLのJOINで複数の表をまとめる場合、以下のどちらの方法が一般的でしょうか。 A, B, C : 表 X, Y : 条件 表ごとにくぎる (A INNER JOIN B ON X) INNER JOIN C ON Y 条件ごとにくぎる A INNER JOIN B INNER JOIN C ON Y ON X 以上よろしくお願いいたします。

  • joinの場合のテーブル名の別名の使用方法

    select * from table1 a,table2 b where a.field1=b.field1; とできますが select * from table1 as a left join table2 as b on a.field1=b.field1; とできません。 joinの場合にテーブル名の別名を使う方法を教えてください