CSVファイルをADOで扱う連載の20回目です。前回の記事はこちらになります。 hirocom777.hatenadiary.org
外部結合
前回は、INNER JOINについてご紹介しました。これで内部結合を効率よく実行できます。
今回は、外部結合をご紹介したいと思います。
今回もSQLを指定してCSVファイルを確認できるツール(CSV_ReaderSQL)を使います。ツールは以下からダウンロードしてください。
CSV_ReaderSQL110.zip - Google ドライブ
外部結合とは
外部結合も内部結合と同じく交差結合の結果から条件を設定して結果を取り出します。外部結合は結合条件で指定するデータが、どちらか片方のファイルにしかない場合の扱いを設定できます。
前回までご紹介したデータは、結合条件で指定されているデータはどちらのファイルにも存在していました。でも、世の中のデータは必ずそうなっていると言う訳ではありません。どちらか片方しか該当するデータがない場合もあるわけです。外部結合は、そのようなケースに使用することが多いのです。
今回使用するファイルは以下の2つになります。商品の単価のファイルと在庫のファイルです。
商品.csv
"商品ID","商品名","単価" "ID001","バナナ","120" "ID002","リンゴ","80" "ID003","ミカン","50" "ID004","カキ","200"
在庫.csv
"商品ID","在庫数","確認日" "ID001","12","2021/10/02" "ID002","15","2021/08/01" "ID003","50","2121/12/05"
この2つのファイルから商品IDと商品名、在庫のテーブルを作ってみましょう。ツールでファイルのあるフォルダーを指定しておいて、SQLコマンド欄に以下を入力して実行ボタンを押してみてください。
SELECT a.商品ID,a.商品名,b.在庫数 FROM [商品.csv] a INNER JOIN [在庫.csv] b ON a.商品ID = b.商品ID
結果は以下の様になりました。
商品ID | 商品名 | 在庫数 |
---|---|---|
ID001 | バナナ | 12 |
ID002 | リンゴ | 15 |
ID003 | ミカン | 50 |
ちゃんとできているように見えますが、カキの項目がありません。在庫管理がまだできていない(入庫実績がないとか)のですね。実際に商品の管理を始めると、この様なケースはよくあると思います。でも、在庫が無くても表には載せておきたいものですよね。そこで、SQLを以下の様にして実行してみましょう。
SELECT a.商品ID,a.商品名,b.在庫数 FROM [商品.csv] a LEFT OUTER JOIN [在庫.csv] b ON a.商品ID = b.商品ID
結果は以下の様になりました。
商品ID | 商品名 | 在庫数 |
---|---|---|
ID001 | バナナ | 12 |
ID002 | リンゴ | 15 |
ID003 | ミカン | 50 |
ID004 | カキ |
これならば、カキの在庫情報がないことが判ります。今回はLEFT OUTER JOINと記述しましたが、OUTERを省略してLEFT JOINとも記述できます。LEFT JOINは結合する左側のファイルの要素を右側のファイルに関係なく表示します。ここをRIGHT OUTER JOIN、またはRIGHT JOINとすると右側のファイルの要素をすべて表示するようになります。
また、空欄の表示が嫌な場合は以下の様にするといいでしょう。
SELECT a.商品ID,a.商品名, IIF(ISNULL(b.在庫数),'未登録',b.在庫数) AS 在庫数 FROM [商品.csv] a LEFT JOIN [在庫.csv] b ON a.商品ID = b.商品ID
結果は以下の様になりました。カキの在庫数は未登録に変換されました。
商品ID | 商品名 | 在庫数 |
---|---|---|
ID001 | バナナ | 12 |
ID002 | リンゴ | 15 |
ID003 | ミカン | 50 |
ID004 | カキ | 未登録 |
ISNULL は、式の内容がNULL(なにもデータがない状態)かどうかを判定します。NULLならば真(true)、そうでなければ偽(false)を返します。表記方法は以下の通りです。
ISNULL(式)
IIFは、条件によって返す式や値を選択できます。表記方法は以下の通りです。
IIF(条件式,真の場合の式または値,偽の場合の式または値)
次回は集計関数
いかがでしたでしょうか。実際の所、結合で一番使用するのはLEFT JOINというのが僕の感覚です。次回は集計関数をご紹介します。CSVファイルのデータを色々な形で集計できます。お楽しみに!!