7216 連結コマンドの落とし穴 はくぶん 2016-09-25 13:58:46
ここ数日出続けていた“Max values are different”のアラートが、ようやく消えた。
もちろん修復したからである。
アラートに気付いて、すぐ修復しようとしたのだが、上手く行かない。
その原因を探っていたら、結局数日掛かってしまった。
その際に気付いたことを、備忘録として書き残しておく。

SQLコマンドに“UNION”というものがある。
カラム構成の同じ複数のテーブルのデータを連結させる時に使う。
連結用コマンドは“UNION”と“UNION ALL”の二つ。
“UNION ALL”は、複数のテーブルのデータを、無条件で全て連結する。
一方“UNION”の方は、同一データの重複を除外しながら連結する。

今回の修復が最初上手く行かなかったのは、ここに俺の認識不足があったからだ。
“UNION”は重複を取り除いてくれるが、それはテーブル間だけでなく、同一テーブル内の重複も取り除いてしまう。
したがって、同一テーブル内に重複データが多数あった場合、“UNION”で複数テーブルのデータを連結すると、連結されたデータ数が、元の単一テーブル内のデータ数より少なくなってしまうことがある。
それが今回起きた現象なのである。
本来の目的は、メインテーブル内にどれだけ重複データがあっても、それらはそのままで、連結するテーブルから重複のないようにデータを追加していく、というものだった。
それを“UNION”を使ってやろうとしたら、思わぬ落とし穴にはまってしまったということである。

メインテーブルからも、連結テーブルからも、該当データを全て取り出し、連結テーブルからのデータは、メインテーブル内のデータと重複しないようチェックしながら追加していく。
そういう風にプロセスを分けないと、意図した結果は得られないことが分かった。
そして、最終的に、その方法でアラートは消えた。
メッセージ文字数:775/796