複数レコードの複数フィールドを一括UPDATEする方法

このQ&Aのポイント
  • 複数のレコードの複数のフィールドを一括でUPDATEする方法について解説します。
  • 顧客テーブルを更新テーブルのデータで更新する際に、年齢と県のフィールドを一括で更新する方法を紹介します。
  • 具体的なデータの例を使用して、顧客テーブルの更新後のデータと更新するためのSQL文を示します。
回答を見る
  • ベストアンサー

複数レコードの複数フィールドを一括UPDATE出来ますか?

顧客テーブルを更新テーブルのデータで更新したい。 No.顧客テーブル = No.更新テーブル です。 更新フィールドは、年齢、県 です。 ●更新テーブル No 年齢  県 --- ----- ------- 1  30  埼玉 2  30  埼玉 3  30  埼玉 ●顧客テーブル(現) No 年齢  県 --- ----- ------- 1  20  千葉 2  20  千葉 3  20  千葉 4  20  神奈川 5  20  福岡 ●顧客テーブル(更新後) No 年齢  県 --- ----- ------- 1  30  埼玉 2  30  埼玉 3  30  埼玉 4  20  神奈川 5  20  福岡 この場合、1つのSQLで、複数レコードの複数フィールドを一括でUPDATEは出来ますでしょうか?

  • Oracle
  • 回答数6
  • ありがとう数6

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

  • ベストアンサー
  • kenthy
  • ベストアンサー率28% (2/7)
回答No.6

またまた実験してみました。 フィールド名を変えてみたり、型を変えてみたりしましたが、すぐに更新完了しました。 インデックスが原因で遅くなってないでしょうか? インデックスは一意になっていますか? (No.のみに一意制約がかかってますか?) また、現在のテーブルをリネームしておいて、新たに同じ定義のテーブルを作成しなおし、リネームしたテーブルから入れてみてはどうでしょうか?

taaaaaaa
質問者

お礼

出来ました。 新テーブルにユニークキーを設置したら動きました。 テーブルを見直してみたところ、 主テーブル...Noがプライマリーキー 新テーブル...他コードがプライマリーキー、Noはキー設定なし。 となっていました。 キー設定のあるなしでこんなに動作に違いが出ると思いませんでした。 これでデータの更新は簡単に行えるのでひとまず安心しました。 本当にありがとうございました。

その他の回答 (5)

  • kenthy
  • ベストアンサー率28% (2/7)
回答No.5

下の回答した者です。 試しに、20000件のテーブルと500件のテーブルを用意して20000件のうち500件をアップデートしてみました。 SQLPlus WorkSheetで実行し、かかった時間は1分かかりませんでした。 ところで、SQLが帰ってこないというのはプログラムで実行しているのでしょうか?それともSQLWorkSheetなどでじかにSQL実行した結果でしょうか? もしプログラムからしているのでしたら、プログラムのループ処理が無限ループに入っている可能性はないかチェックしてみてください。 また、直接SQLを実行していないならSQLWorkSheetなどでSQL単体で実行テストをしてみてください。 ちなみに当方の環境はOracle9iです

taaaaaaa
質問者

補足

いつもいろいろありがとうございます。 SQLは、SQL Plusで実行しています。 クライアントからとサーバから試しましたが同じ結果でした。 テストを実証していただいたので、同様にテストをしてみました。 テストテーブル1 + テストテーブル2 の更新だと問題なく動作します。しかもすごく高速で500件のデータ更新に数秒です。 これを テストテーブル1 + 既存テーブル1 とすると25分。 既存テーブル1 + 既存テーブル2 SQLが終了しない。(2時間経過も終了しない) となってしまいます。 テストテーブル1と2は全く同じ定義のフィールドを持つテーブル同士です。 フィールド名が異なる、フィールド長が異なる、フィールド定義が異なる、のが処理速度の遅さや停止の原因になってるのかとも思っています。

  • kenthy
  • ベストアンサー率28% (2/7)
回答No.4

>table_n が 500件、table_a が20000件ほどあります。 >よって更新するデータは500件ほどです。 ということは、Aの内容をBで更新するという事ですよね? 実際試されたSQLを見ると、本当は「更新される側」を更新する必要があるところを「更新する側」に更新をしていますね。 正しくは下のSQLでいけると思います。 UPDATE table_a a SET (a.年齢,a.県)=(SELECT n.年齢,n.県 FROM table_n n WHERE n.CODE = a.CODE) WHERE EXISTS (SELECT * FROM table_n n WHERE a.CODE = n.CODE)

taaaaaaa
質問者

補足

助言ありがとうございます。 更新用のテーブルで実行するとなぜか上手くいかず2時間以上たってもSQLが終了しません。 そこで仮のテーブルを作ってテストしたら400件のデータ更新で約20分ほどで更新されました。 いままで同じ処理をループをかけて1件づつ行っていました。このSQLも実行速度はあまり期待しないほうがよろしいのでしょうか?  もうちょっと工夫してやってみます。

  • kenthy
  • ベストアンサー率28% (2/7)
回答No.3

質問にあるNo.というのはこれだけで一意になってるんですよね? 私の示したSQLではIDをNo.と置き換えて考えて頂けたでしょうか? どんなSQLを書いて無理だったか貼り付けてもらえませんか? SELECT COUNT(*) FROM TEST_M M WHERE EXISTS(SELECT * FROM TEST_S S WHERE S.ID = M.ID) これで更新件数を確認できると思いますが、意図通りの更新件数が得られるでしょうか?

taaaaaaa
質問者

補足

Noは一意です。これがキーで、重複はありません。 UPDATE table_n n SET (n.年齢,n.県)=(SELECT a.年齢,a.県 FROM table_a a WHERE a.CODE = p.CODE) WHERE EXISTS (SELECT * FROM table_a a WHERE a.CODE = p.CODE) CODEがIDと考えてください。 データは、 table_n が 500件、table_a が20000件ほどあります。 よって更新するデータは500件ほどです。 SQLを発行すると終了しなくなってしまいます。 オラクルのバージョンの問題でしょうか? バージョンは、8.0.5とちょっと古いんです。 更新フィールドが1つのSQLは別のもので試したら動くのですが。 いままでデータを1件1件ループさせて更新していたのでSQL文をすっきりさせて処理の向上が図れればと思ってます。 よろしくお願いいたします。

  • siokara
  • ベストアンサー率41% (7/17)
回答No.2

自分自身を更新の情報に参照することができなかったかと思います。(別名を使っても) ですのでまず、更新したい更新情報テーブルを作ってしまい、その情報を元に更新するしかないと思います・ 参考までに・・ 1.更新したいテーブル構造を作る create table 更新情報テーブル AS select * from 更新元テーブル where ・・・ としてできたテーブル情報を手修正なり、一度trancateして変更情報をInsertなりして 更新情報テーブルを用意する。 >この場合、1つのSQLで、複数レコードの複数フィールドを一括でUPDATEは出来ますでしょうか? 更新元=更新先でUPDATEはできないと思うので、1つのSQLでは不可能だと・ 2つのテーブルを用意したなら、後は連結させて更新するだけです。

  • kenthy
  • ベストアンサー率28% (2/7)
回答No.1

これでいけないでしょうか? 更新用をTEST_S、顧客テーブルをTEST_Mとします UPDATE TEST_M M SET (年齢,県)=(SELECT 年齢,県 FROM TEST_S S WHERE S.ID = M.ID) WHERE EXISTS(SELECT * FROM TEST_S S WHERE S.ID = M.ID)

taaaaaaa
質問者

補足

ヒントありがとうございます。 試してみたのですが、サーバが処理を終了してくれません。ループに入って終了しないような。 検索条件を絞って実行してみたのですが同じ結果です。 処理件数は500レコードほどです。 テストは7レコードでも行ってみました。 何が問題なんでしょうか?

関連するQ&A

  • ACCESSで一括レコード更新

    あるテーブルのレコードを、別のテーブルのレコードで更新したいです。具体的には、 二つのテーブルは同じフィールドを持っています。 フィールド名はID、名前、住所、電話で構成されています。 テーブルA  001 山田 東京 123456  002 田口 千葉 234567  003 鈴木 埼玉 345678  004 斉藤 佐賀 456789  005 上野 大阪 567890 テーブルB  003 鈴木 長野 345678  004 斉藤 佐賀 890123  008 野口 京都 090909 テーブルAとBでIDが一致するレコードだけテーブルAのレコード をそっくり入れ替えるにはどうしたらいいでしょうか。 この場合、003と004のレコードだけ更新します。 テーブルAのIDは主キーでオートナンバー型になっています。

  • 複数レコードのテーブルであるレコードだけ増やしたい

    お世話になります。 複数レコードがあるテーブルにて、あるレコードだけカウントアップする為のSQL文はどのように記述すれば良いでしょうか? 要件: テーブル名'名簿'の No, 名前, 更新者, 備考に 01, 芥川龍之介, ほげ太, NULLを入力し 備考は書き込みさせるためとりあえずNULLを代入しておき 名前と更新者は同じで、Noの部分だけを01~10までカウントアップさせたい 何卒、ご教授のほど、宜しくお願いします。

  • 1テーブル内レコードの各フィールド値の差分チェック

    お世話になります。 現在、1テーブル内をログテーブル用として利用しています。 JSPでフォームを作成して各フィールド値を、 Webサイト画面上から変更可能なつくりにしており、 複数あるいずれかのフィールドの値を1つ以上変更してから、 [保存]ボタンを押下した際に、   ↓ その変更前のレコード1件と、 変更後のレコード1件を、 同じログ用テーブル内へフラグ(変更前:0、変更後:2)を それぞれ変えて、 INSERT INTOでレコードを計2件追加しています。 (あわせて、追加時のタイムスタンプをセットするフィールドもあるので、  どんどんレコードを追加可能な仕様です) そこでご質問なのですが、 この2つのレコードのみを比較して、 値が異なるフィールド名のみを、 (ときには複数フィールドにおいて値が異なるケースも有ります) SELECTなどで表示させるようなSQL文の 作り方をご存じの方がいらっしゃいましたら、 ぜひ教えてください。 なぜこのようなご質問をさせていただいたかと申しますと、 ログテーブル内の上記した2件のレコードを比較して、 どこのフィールドの値が変更されたか? を確認する際に利用したい為です。 (確認時には、phpMyAdminツールなどで直接SQL文をたたいて実行予定です) 以上、宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • 複数フィールド対してLIKE '% %' したい

    SQL初心者なのですが、複数のフィールドをターゲットにしたフリーワード検索用のSQL文の書き方が解らず困っております。 例えば以下の様に"責任者"フィールドを限定して"田中"さんを探す事は出来るのですが、 ---------------------------------------------------------------- SELECT * FROM `会員表` WHERE 責任者 LIKE '%田中%' ---------------------------------------------------------------- 複数の、例えば以下の3つの ●責任者フィールド ●担当者フィールド ●顧客フィールド 全てを対象に一括で”田中”さんを検索したい場合、 どのように記述すれば良いのでしょうか? どなたか有識者の方いらっしゃいましたら宜しくお願いします!!

    • ベストアンサー
    • MySQL
  • アクセスのフィールドデータを一括削除したい

    アクセスのテーブルで、複数のフィールドにある、データのみを一括して削除したいのですが、方法はあるでしょうか。 たとえば顧客テーブルで、 「顧客番号」や「顧客名」「TEL」などのフィールドに格納されている基本データは温存します。 そして、過去の取引履歴として「最終請求日」や「最終入金日」など、複数のフィールドに格納されているデータのみを削除したいのです。 フィールド自体は削除しません。 複数のフィールド(列)を選択して右クリックすると、[ 選択したフィールドデータの削除 ]といったメニューが出ると良いのですが。 全ての顧客に対して、この作業を一括して行ないたいのですが可能でしょうか。      

  • access・複数のテーブル・重複除外したデータ

    accessで複数のテーブルで重複しないレコードだけを抽出するSQL文を知りたいです。 フィールドは多数あり、「フィールドの内容が全て一致するレコード」以外のレコードを 重複しないレコードとして抽出したいと思っています。 テーブルは3つ以上ありますが、2つのテーブルで実行するSQL文でかまいません。

  • Accessで、複数のテーブルで随時、レコードを増やすには…

    Accessを使って、複数のテーブルにリレーションを付けて顧客データベース作りました。 顧客は随時増えていくので、一つのテーブルにレコードを追加したときに、他のテーブルのレコードもそれに連動して、増やす方法はないでしょうか? 現在は、各テーブルに予め十分な(余分な)顧客番号を設定し、顧客増加に対応しています。

  • Access2003複数フィールドの文字数合計

    複数のフィールドに入力されている文字列(数値や文字)の文字数をカウントし、そのレコードごとの合計を1回の更新クエリで算出する方法があれば教えてください。 =========================================================== ☆1つのレコードにA~Eのフィールドがあり、全角・半角の文字および英数字のデータが混在しています。(データの入っていない場合は「null」となる) (例) No  [A]       [B]     [C]       [D]       [E] 1  東京都   港区   ○○1丁目  1-2-3   ●×マンション101 2  神奈川県  横浜市  ○○○町   10-10   △△ビル10F  3    〃      〃     〃       〃        〃    =========================================================== (1) これらの各フィールドの文字数を「LEN関数」を使って、新たなフィールドF~Jに文字数を表示する (2) そして、上記のF~Jの文字数を「SUM関数」を使って、フィールドKへ合計数を表示しています。 (例) No  [F]  [G]   [H]  [I]  [J]   [K] 1   3   2   5   5  10    25 2   4   3   4   5   7     23     =========================================================== 現在は、上記のように、各フィールドの文字数を出してから合計数を計算していますが、 この合計数[K]の値を、フィールドF~Jを作成しなくても一度で計算できるような関数式があれば教えてください。 私は、SQLが書けないので、フィールド欄へ関数式を入力しておりますが、 関数だけでは出来ない場合は、SQLで教えていただければ幸いでございます。 お手数お掛けしますが、宜しくお願い致します。

  • 複数のレコードの値を取り出すには

    初心者です。あるカラムから複数のレコードの値を取り出すにはどのように書けばよいかどなたか教えていただけますでしょうか。 下記のコードではcalendartblというテーブルから1レコードのみ取り出せます。 テーブル:calendartbl holiday(カラム名) 2016/9/12(レコード1行目) 2016/9/14(レコード2行目) 2016/9/20(レコード3行目) 2016/9/26(レコード4行目) 2016/9/28(レコード5行目) コード: $sql = "SELECT calendartbl.holiday FROM calendartbl"; $ret = f_db_select($sql); foreach ($ret as $h){ $holiday = $h['holiday']; } 結果=2016/9/12 では複数のレコード、つまり「2016/9/12、2016/9/14、2016/9/20、2016/9/26、2016/9/28」を取り出して、上記の$holidayに代入させるにはどのように書けばよいでしょうか。 どなたか教えて頂けたら幸いです。 よろしくお願い致します。

    • 締切済み
    • PHP
  • アクセスの複数フィールドからの抽出について教えてください。

    「テーブル1」があり、「テーブル1」の中にフィールドA、フィールドB、フィールドC、フィールドDがあります。  その4つのフィールドの中のどれにも”あ”という言葉が含まれていないレコードを探しだしたいのですが、クリエでOR検索してもうまくいきません。  フィールドAに”あ”は無くても、フィールドBかフィールドCに”あ”といいう文字が含まれているものが出てきてしまいます。どうしてでしょう・・・  ちなみにSQL文は SELECT * FROM TABLE1 WHERE ((Not (TABLE1.フィールドA)="あ")) OR ((Not (TABLE1.フィールドB)="あ")) OR ((Not (TABLE1.フィールドC)="あ")) OR ((Not (TABLE1.フィールドD)="あ"));  となっています。明らかに初歩的な問題だと思われますが、初心者のため分からず困っております。  アドバイス、よろしくお願いします。