データベーススペシャリスト 2024年 午前2 問09
問題文
“商品”表と“納品”表を商品番号で等結合した結果はどれか。


選択肢
ア:
イ:
ウ:
エ:(正解)
🔒 解説は解答すると表示されます
等結合の結果【午前2解説】
正解の理由
等結合(等値結合)では、結合条件を満たす「行の組み合わせ」ごとに出力行が生成され、かつ問題文が想定している結果は両表の全列を含めた出力(すなわち商品表の全列と納品表の全列を両方表示する、select * 相当)です。この条件を満たしているのが エ です。エ は(1)納品表の各行と商品表の対応する行がすべて展開されていること(例:ある商品が複数の納品行を持つ場合、それぞれ別行として現れる)、(2)両表に同名列(商品番号)があるため両方の列が出力されていること、の両方を満たしています。したがって正答は エ になります。
解法ステップ
- 結合条件を確認する:商品表と納品表を「商品番号」で結合する(等結合)。
- 行数の決定:納品表にある各行について、それに対応する商品表の行があれば1行ずつ出力する(多対一の場合は納品表の行数分だけ出力される)。
- 列の決定:問題が想定する出力は両表の全列を含める(select * 相当)ため、同名列が両方あれば両方を表示する。
- 上記を満たす選択肢を選ぶ(複数行展開かつ両方の「商品番号」列を持つものが正しい)。
選択肢別の誤答解説
-
ア:誤り。納品表に同一商品に対する複数の納品行が存在するにもかかわらず、S01 のもう一方(C02, 納品数30)や S02 のもう一方(C03, 納品数40)が出力されていません。つまり「納品表の全行分を展開する」という等結合の基本動作を満たしていないため不適切です。
-
イ:誤り。列構成は両表の「商品番号」列を両方出しており列面では両表の全列を持っていますが、行についてはアと同様に納品表の一部行(S01-C02、S02-C03)が欠落しています。列が両方表示されていることだけを見て正しいと判断すると誤ります。
-
ウ:誤り。行の展開は正しく行われており(納品表の各行がそれぞれ出力されている点は良い)、表示されているデータ内容も合っています。ただし問題が想定している出力形式が「両表の全列を含める(同名列を重複して表示する)」場合、ウは商品番号が1列しか表示されておらず「納品表側の同名列が省略された表示」になっています。つまり、問題が select * 相当の出力を前提としているため不完全と判断されます(対照的に NATURAL JOIN や SELECT で同名列を1つにまとめる場合はウが正解になり得ますが、本問の想定はそれではありません)。
-
エ:正しい。納品表の各行が展開されており、かつ両表の全列(商品表の「商品番号」、商品名、価格 と 納品表の「商品番号」、顧客番号、納品数)が出力されています。これが等結合(商品表と納品表を商品番号で結合し、両表の全列を表示する)として期待される結果です。
よくある誤解
- 「結合すると商品側の行だけ残る/一対一になる」と思う誤解:結合は行の組合せを作る操作で、もし一方に同キーで複数行あればその数だけ出力行が増えます。多対一、1対多の関係を意識してください。
- 「同名列は自動で1つにまとめられる」と考える誤解:自然結合(NATURAL JOIN)や明示的に同名列を除外する書き方をしない限り、select * では両表の同名列が両方出る場合があります。問題文がどの形式を想定しているかを判断することが重要です。
- 選択肢の列順や列名の重複表現に惑わされる誤解:列の表示順や列名の重複は出力方法の違い(select * の順やエイリアス、自然結合など)によるので、行の展開ルール(結合による行数)と列包含の前提を切り分けて考えましょう。
補足コラム
等結合の出力が「どの列を含むか」はクエリの書き方で変わります。問題で想定されているのは一般的な select * を両表に対して適用した形です。実際の SQL 例:
-- 両表の全列をそのまま表示する等値結合(問題想定)
SELECT 商品.*, 納品.*
FROM 商品
JOIN 納品
ON 商品.商品番号 = 納品.商品番号;
この場合、出力には商品.商品番号 と 納品.商品番号 のように同名列が両方含まれ、納品表の行数分だけ出力行が生成されます。一方で
-- 同名列を1つにまとめる自然結合の例(ウに相当する形式)
SELECT *
FROM 商品
NATURAL JOIN 納品;
は同名列が1つにまとめられ、列構成が異なります。問題の選択肢を読む際は、どちらの前提で作られているかを見極めてください。
FAQ
Q. 等結合と自然結合の見分け方は?
A. 選択肢に同名列が1列か2列か、また納品表の全ての行が展開されているかで判断します。select * 両表全列想定なら同名列が両方出る(エのような形)。
Q. 「行が欠けている」とは具体的にどう確認する?
A. 納品表に同じ商品番号で複数行がある場合、等結合結果にも同数の行が現れるはずです。選択肢である商品番号について1行しか出ていなければ「行が欠けている」と判断できます(例:S01 の C02 行が欠けている等)。
Q. 出力で同名列が2列あると実務で困るか?
A. 列名のあいまいさや参照の混乱を避けるため、実務ではエイリアスや必要な列だけを明示的に指定することが多いです。
関連キーワード: 等結合、等値結合、SELECT *、NATURAL JOIN、結合の行数

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

