システム監査技術者 2024年 午前2 問21
問題文
“納品”表と“顧客”表の自然結合と同じ結果を得るSQL文はどれか。

選択肢
ア:SELECT *
FROM 納品
WHERE 納品.顧客番号 = (SELECT 顧客番号 FROM 顧客)
イ:SELECT *
FROM 納品, 顧客
WHERE 納品.顧客番号 = 顧客.顧客番号
ウ:SELECT 納品.顧客番号, 納品.商品番号, 納品.納品数量
FROM 納品, 顧客
WHERE 納品.顧客番号 = 顧客.顧客番号
エ:SELECT 納品.顧客番号, 納品.商品番号, 納品.納品数量, 顧客.顧客名
FROM 納品, 顧客
WHERE 納品.顧客番号 = 顧客.顧客番号(正解)
🔒 解説は解答すると表示されます
自然結合の結果列【午前2解説】
正解の理由
自然結合では、2つの表に共通する列名を結合条件として使い、その列の値が一致する行を組み合わせます。結合結果には、共通列を重複して表示せず、各表のそれ以外の列も含めます。
「納品」表と「顧客」表の共通列は「顧客番号」です。したがって、結果に含まれる列は「顧客番号」「商品番号」「納品数量」「顧客名」です。
この列をすべて指定しているため、自然結合と同じ結果になるのは エ です。
解法ステップ
-
「納品」表と「顧客」表に共通する列名を確認します。
共通するのは「顧客番号」です。 -
共通列の値が一致する行同士を結合すると判断します。
-
結果に必要な列を整理します。
「顧客番号」は重複させずに1列、「商品番号」「納品数量」「顧客名」を加えます。 -
結合条件と、結果に含まれる列の両方が合っている選択肢を選びます。
選択肢別の誤答解説
- ア:副問合せで「顧客番号」を取得し、納品表の行を絞り込んでいます。顧客表との結合ではないため、「顧客名」は得られません。また、副問合せが複数行を返すと、単一の値との比較としてエラーになります。
- イ:「顧客番号」が一致する行同士を結合する点は適切です。しかし、全列を選ぶため、結果に「顧客番号」が2列含まれます。自然結合のように共通列を1列だけにした結果とは異なります。
- ウ:結合条件は適切ですが、「顧客名」を選択していません。そのため、顧客表の情報を含む自然結合の結果とは列が異なります。
- エ:「顧客番号」の一致で結合し、共通列を1列だけ選択したうえで、「顧客名」も含めています。自然結合と同じ列構成になります。
よくある誤解
-
結合条件が同じなら、結果も必ず同じだと思う
行の組合せが同じでも、選択する列が違えば結果は異なります。結合条件とSELECT句の両方を確認します。 -
SELECT * は共通列を自動的に1列にまとめると思う
表を並べて結合する書き方では、SELECT * によって両表の列がすべて選ばれ、共通列が重複することがあります。 -
自然結合は列名ではなく、同じ値の列を探して結合すると思う
自然結合では、基本的に列名が共通する列を結合条件として使います。
補足コラム
この問題のように、FROM句に複数の表を書き、WHERE句で結合条件を指定する方法は、等価結合の書き方の一つです。自然結合と同じ結果にするには、結合条件だけでなく、共通列を重複させないようSELECT句で列を明示することがポイントです。
FAQ
Q. 自然結合では、共通列の値が異なる行も結果に残りますか?
A. 残りません。共通列の値が一致する行同士が結合されます。
A. 残りません。共通列の値が一致する行同士が結合されます。
Q. 自然結合の結果に「顧客番号」は含まれますか?
A. 含まれます。ただし、両方の表にあるからといって2列にはせず、通常は1列として扱います。
A. 含まれます。ただし、両方の表にあるからといって2列にはせず、通常は1列として扱います。
Q. 結合条件が正しければ、SELECT句を確認しなくてもよいですか?
A. いいえ。SELECT句によって出力される列が変わるため、自然結合と同じ結果かどうかは列構成も確認する必要があります。
A. いいえ。SELECT句によって出力される列が変わるため、自然結合と同じ結果かどうかは列構成も確認する必要があります。
関連キーワード: 自然結合、等価結合、結合条件、SELECT句、共通列

\ せっかくなら /
システム監査技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

