サブクエリー③(相関サブクエリー)



サブクエリー③(相関サブクエリー)

相関サブクエリー

これまでに取り上げたサブクエリーは、いずれもそれ自体で完結しているものでした。つまり、サブクエリーを実行すれば、何らかの結果が得られるものでした。今回の相関サブクエリは、特殊な性質を持つサブクエリです。相関サブクエリでは、サブクエリの外部の本体のクエリーの要素をサブクエリの中で使うことができます。

まず、例を使って考えてみましょう。

SELECT * FROM 受注 J WHERE ‘中華まんじゅう’ =
(SELECT 商品名 FROM 商品 S WHERE S.商品コード = J.商品コード);

結果は以下のとおりとなります。

全体としてのSQLは実行可能ですが、この内側のSQLは単体で実行することはできません。

SELECT 商品名 FROM 商品 S WHERE S.商品コード = J.商品コード

何故かというと、WEHRE句の中にある”J.商品コード”がこのSQLの中で定義されていないからです。J.商品コードは受注表の情報ですが、このSQLには受注表に対する定義づけは行われていません。受注表の情報は本体のSQLから渡されています。このように本体の要素をサブクエリの中で使用することを両者の間に”相関がある”という言い方をします。
このSQLの場合、サブクエリはまず本体のクエリから値を受け取り、その値に従って処理した結果を本体のクエリに返します。本体のSQLを元に受注表の情報を再度取り出してみます。

受注表

サブクエリは、この表の1行づつ受け取っていきます。そして受け取った行の商品コードの値と、商品表の各行の商品コードの値を比較し、等しい行があればその行の商品名の列の値を本体のクエリーに返します。つまり、このサブクエリは、本体のクエリから受注情報を受け取るたびに受け取った商品コードを持つ商品を商品表から探し出し、その商品名を本体のクエリに返します。
一方、本体のクエリは、サブクエリから商品名を受け取るたびに次のようにWHERE句でチェックをします。

WHERE ‘中華まんじゅう’ = (サブクエリが返す商品名)

サブクエリから返された商品名が「中華まんじゅう」だった場合、この検索条件は成立します。その結果、「中華まんじゅう」についてだけ、受注表から受注情報が出力されるのです。このように相関サブクエリでは、1行づつ値を処理していくので、本体のクエリのWHERE句で=演算子を使う場合にも、複数の結果を返すことができます。この最初のSQLは相関サブクエリを使わず以下のように表現することができます。

SELECT * FROM 受注 J,商品 S WHERE S.商品コード = J.商品コード AND S.商品名 = ‘中華まんじゅう’

今回の説明は以上です。次回は、EXISTS、ALL、ALLキーワードの説明を行います。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です