H26の午前2 問10に関して
ビギナさん
(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回抽出を行うことで値が重複してしまうように思える。
相関副問合せがわかっていないだけかと思いますが、
細かく流れをお教えいただければ幸いです。
例として下記テーブルがあったとします。
社員番号, 社員名, 性別, 生年月日
① 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日
●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日経過したスレッドへの投稿はできません。