令和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句に「納品」表の列のみを指定しており、「顧客」表の「顧客名」が含まれないため誤りです。 - エ: 正解です。共通列の重複を省いたすべての列が過不足なく指定されています。