ちょっと仕事の関係で業務システムのテーブルを一括更新する必要があり、テスト環境で、いろいろと【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のテーブル更新を使った方が安全で確実か?
コメント