令和6年度春期 応用情報技術者試験 午前 問26
“部品”表及び“在庫”表に対し,SQL文を実行して結果を得た。SQL文のaに入れる字句はどれか。〔SQL文〕SELECT 部品.部品ID AS 部品ID, CASE WHEN 部品.発注点 > a THEN N'必要' ELSE N'不要' END AS 発注要否 FROM 部品 LEFT OUTER JOIN 在庫 ON 部品.部品ID = 在庫.部品ID GROUP BY 部品.部品ID, 部品.発注点

- ア COALESCE(MIN(在庫.在庫数), 0)
- イ COALESCE(MIN(在庫.在庫数), NULL)
- ウ COALESCE(SUM(在庫.在庫数), 0)
- エ COALESCE(SUM(在庫.在庫数), NULL)
解答・解説を見る
正解:ウ
AI解説
発注要否の判定には、部品ごとの在庫数の合計と発注点を比較する必要がある。ただし在庫レコードが1件も無い部品はLEFT OUTER JOINの結果NULLになるため、COALESCE関数でNULLを0に置き換えたうえでSUM(在庫数)と発注点を比較する必要がある。これにより在庫切れの部品も正しく「必要」と判定できる。 ア: MIN(在庫.在庫数)は複数の在庫レコードがある場合に在庫数の最小値を返すだけであり、発注要否の判定に必要な在庫の合計数を表さないため誤りである。 イ: COALESCEの第二引数(在庫レコードが無い場合の代替値)をNULLにしても、NULLとの比較結果は常にUNKNOWN(不定)になり、発注点との大小比較が意図どおりに機能しないため誤りである。 ウ: 正しい。SUM(在庫.在庫数)で部品ごとの在庫数を合計し、在庫レコードが存在しない場合はCOALESCEで0として扱うことで、発注点との比較が在庫切れの部品も含めて正しく行える。 エ: SUM(在庫.在庫数)は正しいが、代替値をNULLにするとイと同様にNULLとの比較がUNKNOWNになり、在庫レコードが無い部品の発注要否が正しく判定されないため誤りである。 💡 LEFT OUTER JOINで結合される側にレコードが無い部品はNULLになる、という点と、集計関数はSUM(合計)であってMIN(最小)ではない点、そしてNULLとの比較は常にUNKNOWNになりCOALESCEでの0置換が必須である点、の3つを押さえておく。
※Web掲載用に表記を一部変更しています。図表はIPA公式問題冊子から引用しています。著作権はIPAに帰属します。