令和6年度 秋期 システム監査技術者試験 午前II 問21

“納品”表と“顧客”表の自然結合と同じ結果を得るSQL文はどれか。

「納品」表と「顧客」表の構造を示す図
図の説明テキスト

「納品」表と「顧客」表の構造を示す図。

納品

顧客番号 商品番号 納品数量

顧客

顧客番号 顧客名
解答・解説

正解: エ. SELECT 納品.顧客番号, 納品.商品番号, 納品.納品数量, 顧客.顧客名
FROM 納品, 顧客
WHERE 納品.顧客番号 = 顧客.顧客番号

自然結合とは

自然結合とは、2つの表に共通する属性(列)の値が等しい行同士を結合し、結合後の表からは共通する属性の重複を取り除いて1つだけ残す関係演算です。

正解の根拠

図より、「納品」表は「顧客番号」「商品番号」「納品数量」の3列、「顧客」表は「顧客番号」「顧客名」の2列で構成されています。
この2つの表の共通列は「顧客番号」です。

これらを自然結合した場合、結果となる表の列は、2つの表の列から共通列の重複を排除した「顧客番号」「商品番号」「納品数量」「顧客名」の4列となります。

SQL文でこの結果を得るためには、WHERE句で「納品.顧客番号 = 顧客.顧客番号」を結合条件とした上で、SELECT句には共通列を1つだけ含めるように列名を個別に指定する必要があります。
選択肢エのSELECT句は「納品.顧客番号, 納品.商品番号, 納品.納品数量, 顧客.顧客名」と指定しており、自然結合の結果である4列の構成と完全に一致します。したがって正解はエです。

各選択肢の解説

  • ア: FROM句が「納品」表のみになっており、結合後の列構成にならないため誤りです。また、副問合せ(SELECT 顧客番号 FROM 顧客)が複数の値を返すとエラーになります。
  • イ: SELECT句が「*」となっているため、両方の表のすべての列(納品.顧客番号, 納品.商品番号, 納品.納品数量, 顧客.顧客番号, 顧客.顧客名)が抽出されます。共通列である「顧客番号」が重複して含まれるため、自然結合の結果とは異なります。
  • ウ: SELECT句に「納品」表の列のみを指定しており、「顧客」表の「顧客名」が含まれないため誤りです。
  • エ: 正解です。共通列の重複を省いたすべての列が過不足なく指定されています。

Spineチーム