サブクエリ_2(CSVファイルをADOで扱う㉓)

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

サブクエリで解決

前回は、サブクエリについてご紹介しました。集計関数の実行する順番もこれで解決です。

f:id:HiroCom777:20220104162440j:plain

前回は1つの値を返すSELECT文をサブクエリとして使用したのですが、それ以外の結果を返すSELECT文もサブクエリとして使う事ができます。今回はそちらをご紹介します。

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

CSV_ReaderSQL110.zip - Google ドライブ

INとサブクエリ

INを覚えていらっしゃいますか?以下でご紹介しました。

hirocom777.hatenadiary.org

複数の値の集合からいずれかに合致する場合を条件として指定できます。INのカッコ内に記述する条件をサブクエリで代替できまるのです。この場合、サブクエリ自体が返す値は列が1つだけのテーブルである必要があります。例を見てみましょう。

以下の2つのファイルがあります。商品の単価リストと売り上げ記録です。

商品.csv

"商品名","単価"
"バナナ","120"
"リンゴ","80"
"ミカン","50"
"カキ","200"

売上.csv

"商品名","数量"
"バナナ","5"
"ミカン","10"
"リンゴ","3"
"カキ","7"

ここから、単価が100円以上の商品の売り上げ記録を求めてみましょう。上記のファイルを同じフォルダーに入れて、ツールでフォルダーを指定してから、以下のSQLコマンドを入力、実行してみてください。

SELECT * FROM [売上.csv] WHERE 商品名
  IN(SELECT 商品名 FROM [商品.csv] WHERE CINT(単価) >= 100)

結果は以下の様になりました。単価が100円以上のバナナとカキの売り上げがでました。

商品名 数量
バナナ 5
カキ 7

このSQLコマンドは以下を実行したものと同じです。

SELECT * FROM [売上.csv] WHERE 商品名 IN('バナナ','カキ')

一方、INの中に記述したSQLコマンドは単体で実行すると以下の結果を返します。

商品名
バナナ
カキ

この結果で、INの内容を指定できるわけです。こうしておけば商品の単価が変わっても、常に単価が100円以上の商品の売り上げ記録が得られますね!!

サブクエリをテーブルとして使う

サブクエリ自体をテーブルとして使用することも可能です。今度は以下のSQLコマンドを実行してみてください。単価が100円以上の商品の売上金額を求めます。

SELECT a.商品名,(a.数量 * b.単価) AS 売上金額 FROM [売上.csv] a INNER JOIN
  (SELECT * FROM [商品.csv] WHERE CINT(単価) >= 100) b
  ON a.商品名 = b.商品名

結果は以下の様になりました。

商品名 売上金額
バナナ 600
カキ 1400

サブクエリ内のSQLコマンドを実行すると

SELECT * FROM [商品.csv] WHERE CINT(単価) >= 100

以下を得ることができます。

商品名 単価
バナナ 120
カキ 200

このテーブルと売上.csvを結合して先の結果を得ているのです。

この結果を求めるには、サブクエリを使わずに以下のSQLコマンドでも求める事ができます。

SELECT a.商品名,(a.数量 * b.単価) AS 売上金額 FROM [売上.csv] a INNER JOIN
   [商品.csv] b ON a.商品名 = b.商品名 WHERE CINT(b.単価) >= 100

もちろんこちらでも正解なのですが、上のSQLコマンドでは売上.csvと商品.csvを結合してから単価が100円以上の商品に絞っています。先に示したSQLコマンドでは先にサブクエリで商品.csvの内容を単価が100円以上の商品に絞っているので、その後に結合してできるテーブルが小さくて済みます。

大きなテーブルを作ってから条件で絞るのと、条件で絞ってから作る小さなテーブルでは使うリソースに違いが出てきます。今回の様に小さなテータでは違いが判らないともいますが、大きなデータを扱う場合にはパフォーマンスに差が出てくるでしょう。

次回はグループ化

いかがでしたか?サブクエリを使うと複雑なSQLコマンドを記述するときに便利です。また、使い方次第ではパフォーマンスを上げることも可能でしょう。次回はグループ化についてご紹介したいと思います。お楽しみに!! hirocom777.hatenadiary.org CSVファイルをADOで扱う連載記事はコチラからどうぞ