CSVファイルをADOで扱う連載の19回目です。前回の記事はこちらになります。 hirocom777.hatenadiary.org
スマートな結合
前回は、交差結合と内部結合についてご紹介しました。複数のファイルから色々な結果を導きだせるのは魅力的です。
ところで、前回は交差都合で得られた結果から条件を指定して内部結合の結果を得ていました。でも、実際にはこの手法は使われることがほとんどありません。もっと効率よく同じ結果を得る方法があるからです。それが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を使っていきましょう。所で結合にはこれ以外にも外部結合というものがあるのです。次回ご紹介します。お楽しみに!!