質問: sqlの副問い合わせと相関副問い合わせの違い 只今シスアド勉強中なのですが、sqlのところでつまずいてしまっています。副問い合わせと相関副問い合わせのそれぞれの意味はわかるのですが、sql文を判断する時、副問い合わせと相関の副問い合わせというのを一目で判断するコツを教えていただけないでしょうか? それとexistsを使った場合の副問合せと相関副問い合わせでも混乱しています。副問合せの場合はサブクエリーから先に条件をクリアしていくと思いますが、existsの場合は真が偽しかデータを返しませんよね? 例えばexists(select * from 売上明細 where 売上明細.商品cd=商品表.商品cd)とあった時、 1つでも商品cdが一致しているものがあれば真のみを返す。 でも、これが相関副問い合わせであれば親分に対して真の”データ”を返す?この場合の副問合せと相関副問い合わせの違いってsql分のどの部分で判断するのでしょうか?わかりにくい説明でもうしわけありません。お分かりになる方どうぞアドバイス下さい。
回答: 副問い合わせは別の文に含まれているselect文ですよね。 相関副問い合わせは、副問い合わせのうち、内側のselect文が参照している列が、外側の文にも含まれている場合だと思います。 集合論の包含関係で言うと、 {副問い合わせ} ⊃ {相関副問い合わせ} だと思います。 だから見分けるには、内側の文で見ている列が、外側の文にもあるかどうか確認する、ということになるでしょう。 処理する順序も違うはずです。 相関副問い合わせの場合、外側の文で一行ずつ処理するたびに、内側の文を処理すると思います。 相関副問い合わせでない副問い合わせの場合、あらかじめ内側の文を一回だけ処理して、結果を記憶しておいて、それをもとに外側の文を処理すると思います。 参考urlにその辺にふれているサイトを挙げておきます。 参考url:http://www.pursue.ne.jp/sqldoc/select15.htm,http://www.pursue.ne.jp/sqldoc/select18.htm