
出典:公益社団法人 日本技術士会「技術士第一次試験 過去問題」
SQL文(SELECT DISTINCT 担当者 FROM 発注書 AS AA WHERE NOT EXISTS (SELECT * FROM 発注書 AS BB WHERE AA.担当者=BB.担当者 AND BB.単価<500))を実行した結果として得られる行数を求める問題。
相関副問合せ(NOT EXISTS)の意味を理解して、条件を満たす担当者を求める問題。
① NOT EXISTSの副問合せ=「単価500未満の発注が1つもない担当者」を選ぶ。DISTINCTで同じ担当者は1件にまとめる
② 斎藤(500, 600, 500)○、山田(600, 400)×、鈴木(500)○
③ 2件(②)
NOT EXISTSの副問合せは、同じ担当者で、単価が500未満の発注書が存在しない場合に真となる。つまり、単価500未満の発注が1つもない担当者を選ぶ。斎藤は、発注が(500、600、500)で、500未満がない→条件を満たす。山田は、発注に単価400があり、500未満が存在する→条件を満たさない(除外)。鈴木は、発注が500のみで、500未満がない→条件を満たす。DISTINCTで重複を除くと、結果は、斎藤、鈴木の2件となり、②が正しい。
NOT EXISTS(相関副問合せ)は、「〜であるものが存在しない」という全称的な条件を表す。「すべての発注の単価が500以上の担当者」を選ぶのと等価。
キーワード: SQL、NOT EXISTS、相関副問合せ、DISTINCT、発注書、関係データベース、情報工学部門