HOME»データベーススペシャリスト令和7年秋期»午前Ⅱ 問9
データベーススペシャリスト令和7年秋期 午前Ⅱ 問9
問9
"名簿1"表と"名簿2"表のそれぞれ対応する行が全て等しいかどうかを確認するSQL文のa,b,cに入れる適切な字句はどれか。
〔SQL文〕

SELECT CASE WHEN COUNT(*) = 0 THEN '等しい' ELSE '異なる' END AS 結果
FROM ((SELECT * FROM 名簿1 a SELECT * FROM 名簿2)
b
(SELECT * FROM 名簿1 c SELECT * FROM 名簿2)
) COMPARE
FROM ((SELECT * FROM 名簿1 a SELECT * FROM 名簿2)
b
(SELECT * FROM 名簿1 c SELECT * FROM 名簿2)
) COMPARE
分類 :
テクノロジ系 » データベース » データ操作
正解 :
エ
解説 :
本問のSQL文は、FROM句で"名簿1"表と"名簿2"表に関係演算を行い、結果セットの行数が0であれば"等しい"、それ以外では"異なる"と結果判定をしています。
"名簿1"表と"名簿2"表が行の集合として等しいと言えるためには、「片方の表だけに属する行が一つもない」という状態を満たす必要があります。この一方にしか含まれない行の集合は、ベン図における A-B と B-A の領域にあたります。
集合AとBについて、A-B と B-A の部分を求める方法は次のとおりです。
設問のSQL文を見ると、FROM句は次の構造になっています。
(名簿1 a 名簿2) b (名簿1 c 名簿2)
和演算はUNION、共通演算はINTERSECT、差演算はEXCEPTにそれぞれ対応するため、集合式 (A∪B)-(A∩B) とSQL文を対応させると、各空欄には以下の演算が当てはまります。
(名簿1 UNION 名簿2) EXCEPT (名簿1 INTERSECT 名簿2)
したがって、空欄aにUNION、空欄bにEXCEPT、空欄cにINTERSECTを指定すれば、一方の表だけに含まれる行を取得するSQL文となります。その結果が0行なら"等しい"、そうでなければ"異なる"と判断できるため、主問合せの判定処理とも整合しています。よって「エ」が正解です。
【別解】
全て等しい状態である"名簿1"表と"名簿2"表にそれぞれの演算を適用した場合、適切な式であれば0行が返るはずです。これを利用して消去法で解答を得ます。
"名簿1"表と"名簿2"表が行の集合として等しいと言えるためには、「片方の表だけに属する行が一つもない」という状態を満たす必要があります。この一方にしか含まれない行の集合は、ベン図における A-B と B-A の領域にあたります。

- AとBの和集合を求める
- AとBの共通集合を求める
- 和集合から共通集合を引く
設問のSQL文を見ると、FROM句は次の構造になっています。
(名簿1 a 名簿2) b (名簿1 c 名簿2)
和演算はUNION、共通演算はINTERSECT、差演算はEXCEPTにそれぞれ対応するため、集合式 (A∪B)-(A∩B) とSQL文を対応させると、各空欄には以下の演算が当てはまります。
(名簿1 UNION 名簿2) EXCEPT (名簿1 INTERSECT 名簿2)
したがって、空欄aにUNION、空欄bにEXCEPT、空欄cにINTERSECTを指定すれば、一方の表だけに含まれる行を取得するSQL文となります。その結果が0行なら"等しい"、そうでなければ"異なる"と判断できるため、主問合せの判定処理とも整合しています。よって「エ」が正解です。
【別解】
全て等しい状態である"名簿1"表と"名簿2"表にそれぞれの演算を適用した場合、適切な式であれば0行が返るはずです。これを利用して消去法で解答を得ます。
- (名簿1 EXCEPT 名簿2) UNION ALL (名簿1 INTERSECT 名簿2)
0行 UNION ALL 3行 = 3行
0行ではないため不適切です。 - (名簿1 EXCEPT 名簿2) UNION (名簿1 INTERSECT 名簿2)
0行 UNION 3行 = 3行
0行ではないため不適切です。 - (名簿1 UNION ALL 名簿2) UNION (名簿1 UNION 名簿2)
6行 INTERSECT 3行 = 3行
0行ではないため不適切です。 - 正しい。(名簿1 UNION 名簿2) UNION (名簿1 INTERSECT 名簿2)
3行 EXCEPT 3行 = 0行
0行になるので適切です。

