No.007
複数テーブルをつなげてレコードを結合する 《ユニオン クエリ》
2003/2007/2010/2013/2016
同じフィールドで構成された複数のテーブルのレコードをそのままつなげて結合、合体させる方法を、お問い合わせいただくことが何度もあります。
方法としては、追加クエリを実行させる方法とユニオン クエリという方法があります。
今回は柔軟でおもしろい、ユニオン クエリをご紹介します。
ユニオン クエリはいくつかの特徴がありますので、その点をおさえながらご案内します。
例えば、次のようなテーブル[テーブル1][テーブル2][テーブル3]があり、データをそのままつなげるとします。
これらのテーブル、多少変則です。
3つのテーブル、すべてのレコード数は12となります。
1件目のレコードは見た目同じデータ、しかしデータ型が統一されていません。
特に、テーブル[テーブル3]の[F3]フィールドはテキスト型です。
では、この3つのテーブルをユニオン クエリを作成して結合してみます。
まずは、ユニオン クエリの作成方法です。
- クエリをデザイン ビューで新規作成し、テーブルを追加せずに空で作成します。
- [クエリ ツール]-[デザイン]タブ-[クエリの種類]グループ-[ユニオン]をクリックします。
- クエリのデザイン ビューは真っ白になりました。あとはSQLを記述します。
<基本のユニオン>
3つのテーブルを、抽出や条件を設定せずに結合します。
SELECT * FROM テーブル1
UNION SELECT * FROM テーブル2
UNION SELECT * FROM テーブル3;
これが基本の書き方となります。
*を指定すると、すべての列という意味になります。
結果は次のとおりです。
件数は10件、すべての列で同じデータ3件は1件にまとめられています。
その他、ユニオン クエリでは、実はフィールド名の合致は必要ありません。最初に指定したテーブルのフィールド名となります。(フィールド名の変更は後述)
ただし、フィールド数は同じでないといけません。
<抽出条件>
抽出条件を設定して結合します。
SELECT * FROM テーブル1
WHERE F1="A"
UNION SELECT * FROM テーブル2
WHERE F3=100
UNION SELECT * FROM テーブル3
WHERE F2="おお";
各テーブルで違う抽出条件を設定することができます。結果は次のとおりです。
<フィールドを指定>
フィールドを指定して表示したい場合は、次のように記述します。
SELECT F1,F2 FROM テーブル1
UNION SELECT F1,F2 FROM テーブル2
UNION SELECT F1,F2 FROM テーブル3;
結果は次のとおり、8件です。
フィールドを同じ数指定するのであれば、元のテーブルのフィールド数は違っていても構いません。
結果フィールド名を変更する場合はAS句を使用し、1行目を次のように指定します。
SELECT F1 AS フィールド1 ,F2 AS フィールド2 FROM テーブル1
UNION SELECT F1,F2 FROM テーブル2
UNION SELECT F1,F2 FROM テーブル3;
<重複も表示>
今までは結果に重複データは省かれていましたが、ALL句を使用すれば重複もすべて表示することができます。
SELECT * FROM テーブル1
UNION ALL SELECT * FROM テーブル2
UNION ALL SELECT * FROM テーブル3;
さて、追加クエリでテーブルのレコードを結合する場合は次のような動作状況となります。
追加先のテーブルに主キーが設定されている場合、同じ主キーレコードは追加されず、エラーが出ます。また、データ型も一致している必要があります。
主キーが設定されていない場合は、重複レコードが生じます。
ユニオン クエリは本当に柔軟な対応ができますので、いざというときに重要な役割を果たしてくれます。