INNER JOIN(CSVファイルをADOで扱う⑲)

CSVファイルをADOで扱う連載の19回目です。前回の記事はこちらになります。 hirocom777.hatenadiary.org

スマートな結合

前回は、交差結合内部結合についてご紹介しました。複数のファイルから色々な結果を導きだせるのは魅力的です。

f:id:HiroCom777:20211123110304j:plain

ところで、前回は交差都合で得られた結果から条件を指定して内部結合の結果を得ていました。でも、実際にはこの手法は使われることがほとんどありません。もっと効率よく同じ結果を得る方法があるからです。それがINNER JOINです。

今回もSQLを指定してCSVファイルを確認できるツール(CSV_ReaderSQL)を使います。ツールは以下からダウンロードしてください。

CSV_ReaderSQL110.zip - Google ドライブ

INNER JOIN

それではINNER JOINについて説明します。今回も前回と同じファイル(名簿.csvと部署リスト.csv)で試してみましょう。

名簿.csv

"名前","部署名"
"大山洋子","工務1課"
"山田太郎","営業3課"
"小田京子","営業2課"
"秋山昇","工務3課"
"大木みすず","工務2課"
"一ノ瀬恵美","営業1課"
"宮崎進","工務2課"
"鈴木麻衣","営業2課"
"青山ゆきお","営業3課"

部署リスト.csv

"部署名","電話番号"
"営業1課","XXX-12345"
"営業2課","XXX-67890"
"営業3課","XXX-88888"
"工務1課","YYY-00000"
"工務2課","YYY-22222"
SELECT 名前,a.部署名,電話番号 FROM [名簿.csv] AS a INNER JOIN [部署リスト.csv] AS b ON a.部署名 = b.部署名

実行してみると、以下の様になりました。

名前 部署名 電話番号
一ノ瀬恵美 営業1課 XXX-12345
鈴木麻衣 営業2課 XXX-67890
小田京子 営業2課 XXX-67890
青山ゆきお 営業3課 XXX-88888
山田太郎 営業3課 XXX-88888
大山洋子 工務1課 YYY-00000
宮崎進 工務2課 YYY-22222
大木みすず 工務2課 YYY-22222

前回と同じ結果を得ることができました。でも、どうしてINNER JOINの方が効率がいいのでしょうか。前回のSQLを以下に再掲します。

SELECT 名前,a.部署名,電話番号 FROM [名簿.csv] AS a,[部署リスト.csv] AS b WHERE a.部署名 = b.部署名

このSQLでは、まず交差結合で総当たりの大きなテーブルを作っています。これ自体が膨大な作業になります。さらにでき上がった大きなテーブルから条件を指定して絞り込む作業も大変な作業です。

その点、INNER JOINでは指定した条件(今回の場合は部署名)からテーブルを作っていきます。その分必要なリソースが少ないという訳です。以下にINNER JOINの記述方法を整理してみました。

SELECT 列名 [ , 列名 ・・・] FROM テーブル1 INNER JOIN  テーブル2 ON 結合条件

3つのファイルを結合する

3つのファイルを結合する事もできます。この場合、SQLは以下の様になります。

SELECT 列名 [ , 列名 ・・・] FROM (テーブル1 INNER JOIN テーブル2 ON 結合条件1) 
INNER JOIN テーブル3 ON 結合条件2 

最初の結合条件をカッコで括るのがポイントです。先の2つのファイルに以下を加えて結合してみましょう。部署別の業務内容が示されています。

業務リスト.csv

"部署名","業務内容"
"営業1課","国内営業"
"営業2課","官公庁"
"営業3課","海外営業"
"工務1課","部品調達"
"工務2課","工場手配"

この状態で以下のSQLを実行してみます。

SELECT 名前,a.部署名,電話番号,業務内容 FROM ([名簿.csv] AS a INNER JOIN [部署リスト.csv] AS b ON a.部署名 = b.部署名)
INNER JOIN [業務リスト.csv] AS c ON a.部署名 = c.部署名

結果は以下の様になりました。業務内容が追加されました。

名前 部署名 電話番号 業務内容
一ノ瀬恵美 営業1課 XXX-12346 国内営業
小田京子 営業2課 XXX-67890 官公庁
鈴木麻衣 営業2課 XXX-67890 官公庁
山田太郎 営業3課 XXX-88888 海外営業
青山ゆきお 営業3課 XXX-88888 海外営業
大山洋子 工務1課 YYY-00000 部品調達
大木みすず 工務2課 YYY-22222 工場手配
宮崎進 工務2課 YYY-22222 工場手配

次回は外部結合

いかがでしたでしょうか。内部結合では効率のいいINNER JOINを使っていきましょう。所で結合にはこれ以外にも外部結合というものがあるのです。次回ご紹介します。お楽しみに!!

hirocom777.hatenadiary.org

CSVファイルをADOで扱う連載記事はコチラからどうぞ