顧客テーブルを更新テーブルのデータで更新したい。
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は出来ますでしょうか?
No.6ベストアンサー
- 回答日時:
またまた実験してみました。
フィールド名を変えてみたり、型を変えてみたりしましたが、すぐに更新完了しました。
インデックスが原因で遅くなってないでしょうか?
インデックスは一意になっていますか?
(No.のみに一意制約がかかってますか?)
また、現在のテーブルをリネームしておいて、新たに同じ定義のテーブルを作成しなおし、リネームしたテーブルから入れてみてはどうでしょうか?
出来ました。
新テーブルにユニークキーを設置したら動きました。
テーブルを見直してみたところ、
主テーブル...Noがプライマリーキー
新テーブル...他コードがプライマリーキー、Noはキー設定なし。
となっていました。
キー設定のあるなしでこんなに動作に違いが出ると思いませんでした。
これでデータの更新は簡単に行えるのでひとまず安心しました。
本当にありがとうございました。
No.5
- 回答日時:
下の回答した者です。
試しに、20000件のテーブルと500件のテーブルを用意して20000件のうち500件をアップデートしてみました。
SQLPlus WorkSheetで実行し、かかった時間は1分かかりませんでした。
ところで、SQLが帰ってこないというのはプログラムで実行しているのでしょうか?それともSQLWorkSheetなどでじかにSQL実行した結果でしょうか?
もしプログラムからしているのでしたら、プログラムのループ処理が無限ループに入っている可能性はないかチェックしてみてください。
また、直接SQLを実行していないならSQLWorkSheetなどでSQL単体で実行テストをしてみてください。
ちなみに当方の環境はOracle9iです
この回答への補足
いつもいろいろありがとうございます。
SQLは、SQL Plusで実行しています。
クライアントからとサーバから試しましたが同じ結果でした。
テストを実証していただいたので、同様にテストをしてみました。
テストテーブル1 + テストテーブル2
の更新だと問題なく動作します。しかもすごく高速で500件のデータ更新に数秒です。
これを
テストテーブル1 + 既存テーブル1
とすると25分。
既存テーブル1 + 既存テーブル2
SQLが終了しない。(2時間経過も終了しない)
となってしまいます。
テストテーブル1と2は全く同じ定義のフィールドを持つテーブル同士です。
フィールド名が異なる、フィールド長が異なる、フィールド定義が異なる、のが処理速度の遅さや停止の原因になってるのかとも思っています。
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)
この回答への補足
助言ありがとうございます。
更新用のテーブルで実行するとなぜか上手くいかず2時間以上たってもSQLが終了しません。
そこで仮のテーブルを作ってテストしたら400件のデータ更新で約20分ほどで更新されました。
いままで同じ処理をループをかけて1件づつ行っていました。このSQLも実行速度はあまり期待しないほうがよろしいのでしょうか?
もうちょっと工夫してやってみます。
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)
これで更新件数を確認できると思いますが、意図通りの更新件数が得られるでしょうか?
この回答への補足
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文をすっきりさせて処理の向上が図れればと思ってます。
よろしくお願いいたします。
No.2
- 回答日時:
自分自身を更新の情報に参照することができなかったかと思います。
(別名を使っても)ですのでまず、更新したい更新情報テーブルを作ってしまい、その情報を元に更新するしかないと思います・
参考までに・・
1.更新したいテーブル構造を作る
create table 更新情報テーブル AS select * from 更新元テーブル where ・・・
としてできたテーブル情報を手修正なり、一度trancateして変更情報をInsertなりして
更新情報テーブルを用意する。
>この場合、1つのSQLで、複数レコードの複数フィールドを一括でUPDATEは出来ますでしょうか?
更新元=更新先でUPDATEはできないと思うので、1つのSQLでは不可能だと・
2つのテーブルを用意したなら、後は連結させて更新するだけです。
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)
この回答への補足
ヒントありがとうございます。
試してみたのですが、サーバが処理を終了してくれません。ループに入って終了しないような。
検索条件を絞って実行してみたのですが同じ結果です。
処理件数は500レコードほどです。
テストは7レコードでも行ってみました。
何が問題なんでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
準・究極の選択
「年収1000万円で一生カレーライス」か 「年収180万円で毎日何でも食べ放題」 あなたはどちらを選びますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
Access サブフォームでの選択行の取得
その他(データベース)
-
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
-
4
2つのテーブルに共通するレコードを削除したい
Access(アクセス)
-
5
[性能改善]AccessのDBに大量のデータをUpdateする場合の性能対策について
その他(データベース)
-
6
Access 同じデータをたくさんのレコード(同一列)に一度に入力するには
Access(アクセス)
-
7
SQL文 複数実行
SQL Server
-
8
ACCESS2000 クエリをテーブル化するマクロ(VBA)おしえてください
Word(ワード)
-
9
【Access】クエリで抽出したデータをCSV形式でエクスポートできますか?
Access(アクセス)
-
10
Access VBAでタブコントロールで選択するタブをしていするには。
Access(アクセス)
-
11
updateで複数行更新したい
Oracle
-
12
Access 複数フォームを開き、画面の最上面にしたいフォームをコント
その他(データベース)
-
13
他のMDBのテーブルに追加したい
その他(プログラミング・Web制作)
-
14
どこにもフォーカスを当てたくない
Access(アクセス)
-
15
YES/NO型の値
Excel(エクセル)
-
16
Access レポート印刷するときに1ページに収める方法
Access(アクセス)
-
17
ACCESSで和暦を西暦に・・・
Access(アクセス)
-
18
ACCESS フォームをそのまま印刷について
その他(データベース)
-
19
[Access]帳票フォームにて連続する非連結コントロールに個々の値を入れるには
Access(アクセス)
-
20
Access VBA SQL文で教えてください
PowerPoint(パワーポイント)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テーブル定義書(Oracle) 【IX】...
-
truncate tableを使って複数の...
-
データ削除とSQL*Loaderでのイ...
-
エラーを起こす方法
-
オラクルのUPDATEで複数テーブル
-
CASEでBETWEEN制約
-
Oracleのリンクテーブルの「精...
-
既にテーブルが存在する場合の...
-
AccessからOracle DB(View)を...
-
[materialized]マテリアライズ...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
【SQL】他テーブルに含まれる値...
-
sqlに記述できない文字
-
既存データをINSERT文にして出...
-
timestamp が空のデータを除い...
-
固定長のデータをmysqlで取り込...
-
同一テーブル内での比較(最新...
-
FROM句のスキーマ名、テーブル...
-
SELECT の仕方 (今月のデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
truncate tableを使って複数の...
-
オラクルのUPDATEで複数テーブル
-
エラーを起こす方法
-
データ削除とSQL*Loaderでのイ...
-
テーブル定義書(Oracle) 【IX】...
-
CASEでBETWEEN制約
-
既にテーブルが存在する場合の...
-
ora-01722のエラーについて
-
Where句のNot条件をAnd条件にし...
-
テーブルに変更があったらCSV出力
-
viewの性能
-
ORA-01630の対応方法について
-
Oracleのリンクテーブルの「精...
-
複数レコードの複数フィールド...
-
oracle テーブルコピー
-
テーブルDROPできないのです。。。
-
AccessVBAにて動的にテーブルを...
-
エクスポート不具合
-
oracle ora-02298
-
SQL-LOADERについて
おすすめ情報