CSVファイルをADOで扱う連載の17回目です。前回の記事はこちらになります。 hirocom777.hatenadiary.org
複雑な統合処理
前回は、UNION ALLを使って複数のCSVファイルを統合してみました。ADOを使うと複数のファイルをまとめる事もできるんですね。ところでUNION ALL以外にもUNIONを使うとCSVファイルを統合できるのですが、こちらは少し動きが違います。今回はコチラをご紹介します。
今回もSQLを指定してCSVファイルを確認できるツール(CSV_ReaderSQL)を使います。ツールは以下からダウンロードしてください。
CSV_ReaderSQL110.zip - Google ドライブ
UNIONとUNION ALLの違い
それでは早速行ってみましょう。今回使うCSVファイルは以下の2つになります。
"クラス","番号" "A","1" "B","1" "C","1" "A","3" "B","3" "C","3" "A","2" "B","2" "C","2"
"クラス","番号" "D","1" "E","1" "F","1" "A","2" "B","2" "C","2"
まずは、UNION ALLを使って2つのファイルを1つにまとめてみようと思います。ツールでファイルのあるフォルダーを指定しておいて、SQLコマンド欄に以下を入力して実行ボタンを押してみてください。
SELECT * FROM [File_1.csv] UNION ALL SELECT * FROM [File_2.csv]
結果は以下の様になりました。2つのファイルを単純に繋げた形です。
クラス | 番号 |
---|---|
A | 1 |
B | 1 |
C | 1 |
A | 3 |
B | 3 |
C | 3 |
A | 2 |
B | 2 |
C | 2 |
D | 1 |
E | 1 |
F | 1 |
A | 2 |
B | 2 |
C | 2 |
続いてUNION ALLの部分をUNIONに変えて実行してみましょう。
SELECT * FROM [File_1.csv] UNION SELECT * FROM [File_2.csv]
結果は以下の様になりました。
クラス | 番号 |
---|---|
A | 1 |
A | 2 |
A | 3 |
B | 1 |
B | 2 |
B | 3 |
C | 1 |
C | 2 |
C | 3 |
D | 1 |
E | 1 |
F | 1 |
UNIONでまとめた方は、一番左の列で昇順に並び変えられているようです。次の列も同じクラスの値内で並び変えられています。また、表示された行数が少ないですね。どうしたんでしょうか?
UNIONの機能
UNIONとUNION ALLの一番の違いは、重複行を削除するところにあります。今回の例では2つのファイルで以下の部分が重複していますので、この部分が1つにまとめられました。
クラス | 番号 |
---|---|
A | 2 |
B | 2 |
C | 2 |
また、UNIONでは統合した結果が右の列から順に昇順に並び変えられます。最終的に一番左の列の並びで結果が表示されます。任意の列で並び変えたい場合は、UNION ALLと同様に最後のSELECT文の最後にORDER BYを付与してください。今回の場合、番号順に並べたい場合は以下のSQLになります。
SELECT * FROM [File_1.csv] UNION SELECT * FROM [File_2.csv] ORDER BY 番号 ASC
結果は以下の様になりました。
クラス | 番号 |
---|---|
A | 1 |
B | 1 |
C | 1 |
D | 1 |
E | 1 |
F | 1 |
A | 2 |
B | 2 |
C | 2 |
A | 3 |
B | 3 |
C | 3 |
UNION使用時の注意点
UNIONで統合するテーブルの条件もUNION ALLと同じです。
- SELECTで指定する列のデータ型が同じか、変換可能である
- SELECTで指定する列数が同じ
また、今回のご紹介の通りUNIONでは統合した結果から並び替え、重複削除の処理を行いますので実行速度は遅くなります。重複がないと解っている場合にはUNION ALLを使う、大きなテーブルでは使わない(使う前にできるだけテーブルを小さくする)などの工夫が必要になります。
次回は結合
今回はUNIONをご紹介しました。性質をよく理解した上で上手く使いましょう。次回は複数ファイルの結合についてご紹介したいと思います。お楽しみに!!