スポンサーリンク

060-SQL

SQL!苦手な【UPDATE】!いろいろ試したがうまくいかなかった!結局ACCESSのクエリでのテーブル更新が早い!

ちょっと仕事の関係で業務システムのテーブルを一括更新する必要があり、テスト環境で、いろいろと【SQLのUPDATE】を試してみましたが・・・

本やネットで調べてもイマイチ上手くいきませんでした。

結論から述べると、【MS-ACCESSでリンクテーブルを貼って、テーブル更新】するのがイチバン安全で確実だったわけですが・・・

これは、管理人の【SQL】の知識がまだまだという事でしょう・・・

一般的な【UPDATE】構文は

一般的な【UPDATE】構文は次のとおりです。

update
  テーブル1 ta
set
  ta.カラム1 = 'AAA'.
  ta.カラム2 = 'BBB'
where
  ta.カラム3 = 'CCC'
;

という具合です。

ここから発展して別のテーブルから更新後の値を持ってこようとするとサブクエリが必要になります。

update
 テーブル1 ta
 set
 (ta.カラム1.ta.カラム2) = (
   select
         tb.カラムX,tb.カラムY
      from
         テーブル2 tb
      where
         ta.カラム3 = tb.カラムZ)
;

しかし、上記でも【SQL】いちおうは動きますが・・・

テーブル1のデータを全件ナメますので、非常に時間が掛かります。

ここで、更新が必要なテーブル1のレコードだけを更新させるには・・・

【EXISTS】が必要となります。

update
 テーブル1 ta
set
 (ta.カラム1.ta.カラム2) = (
   select
     tb.カラムX,tb.カラムY
   from
     テーブル2 tb
   where
     ta.カラム3 = tb.カラムZ)
where
exists ( select 1 from テーブル2 tb where ta.カラム3 = tb.カラムZ)
;

これで、テーブル1の更新が必要なレコードだけナメてくれるので、早くなるかなと思ったのですが、処理時間はあまり変わりませんでした。

実際の【SQL】では、サブクエリの中に【group by】がありましたので、どうやらこれが影響していた様です。

いろいろネットで調べてみると原則的に【UPDATE】では、【group by】が使えない様です。

今回無理やり実行しましたが・・・

かなり時間が掛かり、さらに一部のレコードが更新されていないという現象が発生していました。

恐らく、サブクエリ内に【group by】があった事が原因のようです。

インライビューを使った【UPDATE】もできる様だが何故か上手くいかなかった

【UPDATE】ではインライビューを使った方法もあるようです。

上の例をインラインビューに変更すると

update
 (select
     ta.カラム1,
     ta.カラム2,
          tb.カラムX,
          tb.カラムY
   from
     テーブル1 ta,
     テーブル2 tb
   where
     ta.カラム3 = tb.カラムZ)
set
 (ta.カラム1.ta.カラム2) = (tb.カラムX,tb.カラムY)

:

でも・・・できる様ですが、管理人はうまくできませんでした。

スポンサーリンク

ブログランキングにご協力ください!
ブログランキング・にほんブログ村へ

結局【MS-ACCESS】でテーブル更新するのがイチバン安全だった

最終的には、SQLでのUPDATEは、中途半端な結果となってしまったので、結局いつものごとく、【MS-ACCESS】のテーブル更新を利用して実施すると綺麗に更新されました。

しかし、【MS-ACCESS】でもクエリ内に【group by】があると上手くいきませんでしたので、【group by】を使わずに更新したいレコードを特定する必要があります。

今回は、5,000件くらいのレコードの更新でしたが、【MS-ACCESS】は結構使えるもんだなと改めて思いました。

SQLが知らなくても、GUIで操作できるというモノはやはり便利ですね。

ちなみに、【MS-ACCESS】での更新クエリの【SQL】を確認すると次の様な構文でした。

update
  (テーブル1 ta inner join テーブル2 tb
      on ta.カラム3 = tb.カラムZ)
set
 (ta.カラム1.ta.カラム2) = (tb.カラムX,tb.カラムY)

;

構文的には、インラインビューと同じ形式です。

次回はこの構文形式で【SQL】でも試してみたいと思います。

まとめ

SQLのUPDATEはサブクエリを使うと遅くなる

最終的にACCESSのテーブル更新を使った方が安全で確実か?

ブログ開設に必要なドメイン取得、サーバーレンタル、ASPの登録等は、こちらのサイトから!

スポンサーリンク
スポンサーリンク

-060-SQL

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

code1-eyecatch

SQLの基本はここから「選択」select文!

SQL 選択 続いて、選択を行ってみます。 選択は、行を抽出することです。 先ほどの、テーブル(表)を使って、実践していきます。 選択の例は、次のとおりです。 select  * from  koji …

改めて実感!フリーウエア【A5:SQL MK-2】が便利で高機能!使い方!

管理人はよくデータ抽出にSQLを使います。 これが使えるととかなり便利で予算や決算時期にシステムから自由自在にデータを抽出させることができます。 当然、各役所で使っているシステム(財務会計)にはデータ …

code1-eyecatch

SQLでまず始めはこれをやってみる!システム日時「sysdate」を表示させる方法!

さて、実際にSQLを使ってみましょう。 A5:SQL Mk-2の使い方 A5:SQL Mk-2を起動し、 ファイル → 新規 → SQL を選択します。 SQLを入力する画面の上でのタブで、前回設定し …

code1-eyecatch

SQLを無料で使える環境を作る方法!A5:SQL Mk-2は無料で高機能!

まずは、SQLを使える環境整備です。 まず、SQLが使えるソフトウエアを用意します。 A5:SQL Mk-2は、フリーウエアでも高機能 フリーウエアであれば、A5:SQL Mk-2 が高機能で良いかと …

これで安心!すぐに忘れるOracle「オラクル」SQLの忘備録!

SQLはすぐに忘れて中々覚えられない! 管理はSQLは良く使いますが、毎日というわけではありませんので毎回すぐ忘れます。 使おうと思ったら「アレ・・・?」となり毎回「Google先生」で検索です。 こ …

スポンサーリンク
スポンサーリンク
スポンサーリンク