このエントリーをはてなブックマークに追加

ユニオンクエリ/複数のテーブルを結合する。

こちらは、Accessで作成した、仕入先のデータが入っている「T_仕入先」テーブルと、販売先のデータが入っている「T_得意先」テーブルです。例えばこれらを、仕入先、得意先の区別は関係なく、ひとつの住所録としてまとめるとします。そこで、この2つのテーブルを結合して、ひとつのクエリを作成していきたいと思います。

テーブルテーブル

今回のように複数のテーブルを結合するときは、「ユニオンクエリ」というクエリを使って作成します。Accessで選択クエリなどを作るときは、クエリのデザインビューを使って作成しますが、ユニオンクエリの場合は、デザインビューは使わず、SQLステートメントを記述する画面に行って、SQLを書いていきます。

SQLの記述場所

まず、リボンの「作成」タブの「クエリデザイン」をクリックします。「テーブルの表示」ダイアログが表示されますが、今回は、SQLを記述するので、「閉じる」ボタンを押します。

クエリデザイン

「クエリツール」の「デザイン」タブが表示されるので、その中から「ユニオン」をクリックします。

クエリデザイン

真っ白な画面が表示され、ここにSQL文を書いていきます。

ユニオンクエリ

UNION演算子で結合する。

2つのテーブルを結合するには、2つのテーブルを「UNION」または、「UNION ALL」で繋いであげます。

「T_仕入先」テーブル UNION 「T_得意先」テーブル

わかりやすく書くと上のようになるのですが(この書き方は正しくありません)、実際には、2つのテーブルを選択クエリの形にして、UNION演算子で繋ぎます。さらに、選択クエリの部分は、SQLのSELECTステートメントで記述するようにします。

SELECT * FROM T_仕入先 UNION SELECT * FROM T_得意先;

SELECT * FROM T_仕入先

こちらのSELECTステートメントは、選択クエリのデザイングリッドで、「T_仕入先」テーブルのフィールドを順番にすべて選択したときと、同じ結果になります。「*」アスタリスクは、すべてのフィールドを選択するという意味になります。これは、選択クエリを作るときも、すべてのフィールドを選択するときに、使うことができます。

このユニオンクエリはこのような結果になり、2つのテーブルが結合されています。

ユニオンクエリ

UNION演算子とUNION ALL演算子

例えば、「T_得意先」テーブルに、「T_仕入先」テーブルにあるレコードとまったく同じ内容のレコードがあったとします。(仕入先IDがS0003のギンザ㈱が、それに当たります)このようなときに、「UNION ALL」を使うと、同じ内容のレコードもすべて結合して表示させますが、「UNION」を使うと、重複している同じ内容のレコードは除いて表示されるようになります。

テーブル

テーブル

UNION ALLを使って結合した結果です。重複しているレコードがそのまま表示されます。

SELECT * FROM T_仕入先 UNION ALL SELECT * FROM T_得意先;

ユニオンクエリ

UNIONを使って結合した結果です。重複しているレコードは除いて表示されます。

SELECT * FROM T_仕入先 UNION SELECT * FROM T_得意先;

ユニオンクエリ

結合させるテーブルのフィールド数を揃える。

「T_得意先」テーブルに「E_MAIL」というフィールドを追加したとします。(テーブル名を「T_得意先2」としています)

テーブル

そこで、この「T_得意先2」テーブルを「T_仕入先」テーブルと結合させようとすると、次のメッセージが表示され。結合することができません。

メッセージ

ユニオンクエリでは、結合するテーブルのフィールドの数を揃えておく必要があります。フィールド名については、テーブルごとに違う名前でも、結合はされますが、UNION演算子で繋ぐときに、一番最初に記述したテーブルのフィールド名がクエリの結果に表示されます。ですが、このフィールド名は「AS」を使うことで、変更することができます。

ユニオンクエリのフィールド名を変更する。

ユニオンクエリを使うと、その結果を表示するフィールド名には、SQL文で最初に記述したほうのテーブルのフィールド名が表示されます。

SELECT * FROM T_仕入先 UNION SELECT * FROM T_得意先;

ユニオンクエリ

ですが実際には、仕入先と得意先のデータが格納されているので、フィールド名を「企業ID」と「企業名」というふうに変更します。

SELECT 仕入先ID AS 企業ID,仕入先名 AS 企業名,住所,TEL,FAX 
FROM T_仕入先 
UNION ALL SELECT * FROM T_得意先;

SELECT 仕入先ID AS 企業ID ,仕入先名 AS 企業名

SQL文の最初に記述した、T_仕入先テーブルの仕入先IDをASを使って企業ID、また、仕入先名を企業名というフィールド名に変換しています。この場合は、「*」の代わりに、すべてのフィールドを記述することとなります。

ユニオンクエリ

ユニオンクエリの並べ替え。

ユニオンクエリで結合したテーブルを指定したフィールドを基準に並べ替えることができます。

SQL文の最後に「ORDER BY」句で、並べ替えをするフィールド名を指定します。フィールド名は、SQL文で一番最初に記述したテーブルのフィールドを指定します。また、「AS」で名前を変更しているときは、変更後の名前をします。ここでは、「企業名」を指定して並べ替えをしています。

SELECT 仕入先ID AS 企業ID,仕入先名 AS 企業名,住所,TEL,FAX 
FROM T_仕入先 
UNION ALL SELECT * FROM T_得意先
ORDER BY 企業名;

ユニオンクエリ

ORDER BY句のフィールド名のあとに「DESC」を付けると、降順で並べ替えるようになります。
ORDER BY 企業名 DESC;

ユニオンクエリに抽出条件を付ける。

テーブルに抽出条件を指定して、ユニオンクエリで結合することができます。「WHERE」句を使って、それぞれのテーブルごとに抽出条件を指定します。

例えば、仕入先テーブルと得意先テーブルにそれぞれ、「種別」フィールドを追加します。(テーブル名は、「T_仕入先A」「T_得意先A」)

テーブルテーブル

「SELECT フィールド名 FROM テーブル名」のあとに「WHERE」句を付けます。WHERE句はそれぞれのテーブルごとに付けますが、すべてのテーブルにWHERE句を付ける必要はありません。

SELECT * FROM T_仕入先A WHERE 種別 = "A" 
UNION ALL 
SELECT * FROM T_得意先A WHERE 種別="C";

ユニオンクエリ
「ORDER BY」句を指定するときは、SQL文の一番最後に記述します。

SELECT * FROM T_仕入先A WHERE 種別 = "A" 
UNION ALL 
SELECT * FROM T_得意先A WHERE 種別="C"
ORDER BY 仕入先名;

ユニオンクエリで3つ目のテーブルを結合する。

3つ以上のテーブルを繋げることもできます。その場合は、2つ目以降のテーブルの後に、同じように「UNION」または、「UNION ALL」で繋いであげます。「ORDER BY」句で並べ替えを指定するときは、SQL文の一番最後に付け加えます。

SELECT 仕入先ID AS 企業ID,仕入先名 AS 企業名,住所,TEL,FAX 
FROM T_仕入先 
UNION ALL SELECT * FROM T_得意先 
UNION ALL SELECT * FROM T_工場
ORDER BY 企業名;

ユニオンクエリ

このエントリーをはてなブックマークに追加

コメントを残す

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

コメントフィード

トラックバックURL : http://gyoumuka.work/wp-trackback.php?p=3332

PAGE TOPへ戻る