SQL INNER JOINについて

今回はINNER JOINについて説明します。またAccessが自動で作成したSQL文と修正したSQL文を比較してみましょう。

【1】Accessのファイル「SampleDB4.mdb」を起動し、「SQL練習」のSQLビュー画面を開いてください。

access-sql85.gif


【2】以下のSQL文をくらべてみましょう。各SQL文を貼り付け、実行ボタン「!」をクリックします。データシートビューで見ると同じ結果になります。

・Accessが自動で作成したもの
SELECT T07Slip.SLIP_CD, T07Slip.SLIP_DATE, T07Slip.CST_CD, T04Customer.CST_NAME, T05Sex.SEX, "〒" & [ZIP_CODE] & " " & [PREF_NAME] & [CITY_NAME] & [TOWN_NAME] & [ADDRESS] AS ADDRESS2
FROM ((((T07Slip INNER JOIN T04Customer ON T07Slip.CST_CD = T04Customer.CST_CD) INNER JOIN T05Sex ON T04Customer.SEX_CD = T05Sex.SEX_CD) INNER JOIN T03Town ON T04Customer.TOWN_CD = T03Town.TOWN_CD) INNER JOIN T02City ON T03Town.CITY_CD = T02City.CITY_CD) INNER JOIN T01Prefecture ON T02City.PREF_CD = T01Prefecture.PREF_CD
ORDER BY T07Slip.SLIP_CD;

・修正したもの
SELECT SLIP_CD, SLIP_DATE, T07Slip.CST_CD, CST_NAME, SEX, "〒" & ZIP_CODE & " " & PREF_NAME & CITY_NAME & TOWN_NAME & ADDRESS AS ADDRESS2
FROM T07Slip,T04Customer,T05Sex,T03Town,T02City,T01Prefecture
WHERE T07Slip.CST_CD = T04Customer.CST_CD
AND T04Customer.SEX_CD = T05Sex.SEX_CD
AND T04Customer.TOWN_CD = T03Town.TOWN_CD
AND T03Town.CITY_CD = T02City.CITY_CD
AND T02City.PREF_CD = T01Prefecture.PREF_CD
ORDER BY T07Slip.SLIP_CD;

結果は同じですが、2つのSQL文には大きな違いがあります。


【3】次は各SQL文を「SQL練習」のデザインビューで見てください。

・Accessが自動で作成したもの
access-sql209.gif

Accessが自動で作成したものはテーブル同士の結合にINNER JOINが使われているため、線で結ばれています。

・修正したもの
access-sql210.gif

修正したものは線で結ばれる代わりに抽出条件に何か書かれています。実はこの部分がWHEREにあたります。

例えばテーブルT07SlipのCST_CD抽出条件に [T04Customer].[CST_CD] と書かれています。これは「T07SlipのCST_CD」と 「T04CustomerのCST_CD」で条件の一致するレコードを抽出するという意味です。PREF_CD、CITY_CD、TOWN_CD、SEX_CDについても同様です。


【解説】
Accessが自動で作成したSQL文は、INNER JOINが使われているため、FROM部分がとても複雑になっています。テーブル名と抽出条件が同時に書かれているためです。

しかもフィールド名が完全に「テーブル名.フィールド名」のかたちで指示されていて、冗長化されています。そのかわりクエリのデザインビューで見るとシンプルです。

INNER JOINは内部結合ともいわれ、条件の一致するレコードを抽出します。2つくらいのテーブルならそれほど難しくないです。下記なら何とか分かると思います。

T07Slip INNER JOIN T04Customer
ON T07Slip.CST_CD = T04Customer.CST_CD

しかしINNER JOINはテーブル数が増えると、入れ子になって初心者には難しくなります。入れ子とは入れ物の中に入れ物があり、さらにその中に入れ物が・・・という感じの構造です。つまり括弧がいっぱい出てきます。

どこまでが一組の()括弧か非常にわかりにくいです。INNER JOINの入れ子状態を分かりやすく書くとこんな感じです。

(
(
(
(
T07Slip INNER JOIN T04Customer ON T07Slip.CST_CD = T04Customer.CST_CD
) INNER JOIN T05Sex ON T04Customer.SEX_CD = T05Sex.SEX_CD
) INNER JOIN T03Town ON T04Customer.TOWN_CD = T03Town.TOWN_CD
) INNER JOIN T02City ON T03Town.CITY_CD = T02City.CITY_CD
) INNER JOIN T01Prefecture ON T02City.PREF_CD = T01Prefecture.PREF_CD


逆に修正したものはデザインビューでは複雑ですが、SQL文はシンプルになっています。FROMには使うテーブル名だけを書き、WHEREでテーブル同士の関係をまとめていますので、理解しやすいと思います。

FROM T07Slip,T04Customer,T05Sex,T03Town,T02City,T01Prefecture
WHERE T07Slip.CST_CD = T04Customer.CST_CD
AND T04Customer.SEX_CD = T05Sex.SEX_CD
AND T04Customer.TOWN_CD = T03Town.TOWN_CD
AND T03Town.CITY_CD = T02City.CITY_CD
AND T02City.PREF_CD = T01Prefecture.PREF_CD


もちろん最初から修正したもののようにクエリをデザインすると、Accessは修正したSQL文に近い形で作ってくれます。

冗長化を省いたり、テーブルに別名を使ってSELECTやWHEREをシンプルに書くには、やはり最後は人間の手による修正が必要です。

スポンサードリンク

スポンサードリンク






Access SQL初心者入門講座TOPへ