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

スポンサーリンク
060-SQL

ちょっと仕事の関係で業務システムのテーブルを一括更新する必要があり、テスト環境で、いろいろと【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の登録等は、こちらのサイトから!

コメント

タイトルとURLをコピーしました