HOME»データベーススペシャリスト掲示板»H26の午前2 問10に関して
投稿する

H26の午前2 問10に関して [0018]

 ビギナさん(No.1) 
初歩的なことかもしれませんが、H26の午前2 問10に関して質問がございます。

例として下記テーブルがあったとします。

    社員番号, 社員名, 性別, 生年月日
①  001,佐藤,男,1970年3月1日
②  002,鈴木,女,1977年8月1日
③  003,山田,男,1975年4月1日
④  002,加藤,女,1987年8月1日

この場合に問題の内容と同じSQLで最年長以外の人のタプルを取得する場合
相関副問合せの論理から考えると、副問合せは下記動きとなると思います。

●S1の1行目
・下記の行がマッチ
S1.① 男 =  S2.① 男
S1.① 男 =  S2.③ 男

・副問合せで得られる結果=1970年3月1日

●S1の2行目
・下記の行がマッチ
S1.② 女 =  S2.② 女
S1.② 女 =  S2.④ 女

・副問合せで得られる結果=1977年8月1日

●S1の3行目
・下記の行がマッチ
S1.③ 男 =  S2.① 男
S1.③ 男 =  S2.③ 男

・副問合せで得られる結果=1970年3月1日

●S1の4行目
・下記の行がマッチ
S1.④ 女 =  S2.② 女
S1.④ 女 =  S2.④ 女

・副問合せで得られる結果=1977年8月1日

これら4つの結果ごとに主問合せでのwhere句による抽出が行われると思うのですが、
疑問点がいくつかあります。

・男女関係なく1970年3月1日よりも先の生年月日が抽出されように思える
・4回抽出を行うことで値が重複してしまうように思える。

相関副問合せがわかっていないだけかと思いますが、
細かく流れをお教えいただければ幸いです。
2017.04.04 14:48
管理人(No.2) 
相関副問合せでは、主問合せ側の行ごとに主問合せ側の値を使ったSQL文が実行されます。

●S1の1行目
・副問合せで得られる結果=1970年3月1日
・主問合せ側の生年月日=1970年3月1日
  WHERE 1970年3月1日 > 1970年3月1日 →  偽

●S1の2行目
・副問合せで得られる結果=1977年8月1日
・主問合せ側の生年月日=1977年8月1日
  WHERE 1977年8月1日 > 1977年8月1日 →  偽

●S1の3行目
・副問合せで得られる結果=1970年3月1日
・主問合せ側の生年月日=1975年4月1日
  WHERE 1975年4月1日 > 1970年3月1日 →  真

●S1の4行目
・副問合せで得られる結果=1977年8月1日
・主問合せ側の生年月日=1987年8月1日
  WHERE 1987年8月1日 > 1977年8月1日 →  真

したがって結果セットはWHERE句が真を返した以下の2つになります。
③  003,山田,男,1975年4月1日
④  002,加藤,女,1987年8月1日
2017.04.05 11:05
 ビギナさん(No.3) 
なるほど、一行の意味を取り違えていました。
理解しました!ありがとうございました!
2017.04.05 20:21
返信投稿用フォームスパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
© 2016-2024 データベーススペシャリストドットコム All Rights Reserved.

Pagetop