~データベース入門から設計/運用の初歩まで[改訂第4版]SQLポケットリファレンスFROM句の副問合せインラインビューの副問合せは、私自身WHERE句の副問合せより良く用いる方法です。考え方がわかりやすい点、利用価値が高い感じがします。ある例として売上データの日毎の集計を一つのSELECT文で取得するものを以下に示します。560000この例では親のSELECT文のFROM句に3個の副問合せのSELECT文を含んでいます。それぞれの副問合せはほとんど同じ形式で、TT_売上の売上日の条件が11月1日~11月3日に変わっているだけです。副問合せはTT_売上、TT_売上明細、TM_商品から売上数量と売上単価を掛けた金額を合計する集計SELECT文です。1346000また、売上日の条件を変えればいろいろな集計が得られます。1年の各月毎の売上集計を行ったり、各年毎の売上集計を行えます。以下に簡単な例を示します。3256000FROM句の副問合せは、複雑なSELECT文を考える場合に要求されている条件を段階的に処理して簡単な条件の組み合わせにしていくことが出来ます。この副問合せを見た時には目から鱗で、こんなことが出来るんだと思ったものでした。非常に便利な機能ですがあまりネストを深くしたり、インラインビューを多くすると自分で何をやっているのかわからなくなりますのでほどほどにしたほうが良いかと思います。ページのトップへ戻るFROM句の副問合せその2今回は、前回あった月毎の売上金額の集計のSQLを少し変化させて、商品毎の各月毎(11月と12月のみですが)の売上数量を集計する様なSQLについて以下に例を示します。以下のSQLは、FROM句の中にSELECT文が入った副問い合わせの形をしています。7~14行では売上明細から11月の売上で商品毎の売上数量の集計の一覧をT1と言う仮の名前でテーブルとして扱っています。17~23行では同様に12月の売上の集計を行い、T2の名前を付けています。11月の売上を主たるテーブルとして、12月の売上にリンク指定を行っています。111行が選択されました。実はこのSQLには問題点があります。11月には売上データが存在しなくて、12月に売上データが存在する場合には、SQLの結果として表示されなくなります。これを解消するには、1年を通した商品毎のSELECT文を主テーブルの様に考えて、それに各月毎のSELECT文をリンクする様にすれば問題なく全てのデータが表示されます。以下にそのSQLを示します。9~14行目で1年間に売上が発生した商品コードの一覧を返すSELECT文をTYとし、17~23、26~32、35~41の各行でそれぞれ10月、11月、12月のデータを抽出するSELECT文をFROM句の副問い合わせとしています。TYを主テーブルとして考え、残りのテーブルをLEFT-JOINのリンクを行っています。3か月分しか例を示していませんが、残り1月~9月までを加えれば年間の商品毎の各月の売上数が一覧できるSELECT文が完成すると思います。TO_DATE('2002/10/31')の様なTU.売上日に対して計算しない方が実行時間は速いと思います。111行が選択されました。ページのトップへ戻るWHERE句の副問合せWHERE句にSELECT文の問合せを含める方法で、以下に例を示します。1WHERE句の括弧内のSELECT文は商品名が'PC-9001'である商品コードを返します。この部分のみを実行すると以下の様になります。1結果的に最初の副問合せのSELECT文は以下の様な形に簡単化されます。1このWHERE句の条件で商品コードと"1"は”=”で結合されていますが、これは商品コードの条件が1個のみしかないということです。このことを考えながら以下のSELECT文と実行結果を見てください。エラーが発生しました。単一行副問合せにより2つ以上の行が返されます。WHERE句内のSELECT文のWHERE条件がLIKE演算子で記述されていて、この括弧内を実行すると結果は2行以上のデータが返されてしまいます。メインのWHERE句は=演算子なので1個の値しか右側に持ってこれないので結果として例の様にエラーが返されます。このエラーを解消する場合には=演算子ではなくIN演算子を用いるとうまくいきます。IN演算子は引数として2個以上の値を持てるからです。16行が選択されました。WHERE句の副問合せに関しては今回はこのくらいにして、次回はもう少し複雑なものを取り上げたいと思います。213行が選択されました。サブクエリー内で参照するテーブルのコードとのリンクを指定します。このサブクエリーは考え方としては、その部分でサブルーチン的に必要なカラムを取得するといった感じでしょうか。サブクエリーを用いなくても以下の様なSQLであれば、上の結果と同じものが取得できます。SELECT句にサブクエリーを持っていくことも、SQLを見やすくする方法かもしれません。TD.明細番号;表示上のカラム数を設定する場合は、以下のSQL-Plusのコマンドを使用します。AXXX「XXX」の部分はカラム数を指定します。この設定を解除する場合は、以下のコマンドを実行します。CLEAR上記のSQLの実行する前に以下のコマンドを実行してあります。A15これらのカラム数指定を解除するのは以下のコマンドです。CLEAR尚、1ページの表示行数を大きくすれば、タイトルが何度も表示されません。