スポンサーリンク

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

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

関連記事

【A5:SQL MK-2】で【PostgreSQL】に接続できない!解決方法は?pg_hba.confファイルの設定を変更する!

本年度は、底辺公務員の管理人が勤務する役所の大規模なシステム更新があります。 OracleからPostgresSQLへの移行が最近は多い? 役所のシステムの多くは、基本的にデータベースの塊となっていま …

code1-eyecatch

SQLを使って仕事を早く済ませる!これで面倒なエクセルでの表作成とはおさらば!

SQLとは、データベースを直接操作して、条件を指定してデータを抽出することです。 役所のデーターベースは、殆どがOracle(オラクル) 役所の基幹業務(住民基本台帳業務、課税業務、収納業務、保険業務 …

code1-eyecatch

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

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

code1-eyecatch

SQL・サンプルデータベース・MS-ACCESS!これで実際に体験してみよう!

これまでの、基本をMS-ACCESS(マイクロソフトアクセス)に纏めてみました。 スポンサーリンク ブログランキングにご協力ください! SQLサンプデータベース(MS-ACCESS)ダウンロード ここ …

code1-eyecatch

SQLの基本はここから「射影」select文!

スポンサーリンク ブログランキングにご協力ください! SQL 射影 続いて、射影を行ってみます。 射影は、カラム(列)を抽出することです。 先ほどの、テーブル(表)を使って、実践していきます。 射影の …

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