データベーススペシャリスト令和7年秋期 午前Ⅱ 問9

問9

"名簿1"表と"名簿2"表のそれぞれ対応する行が全て等しいかどうかを確認するSQL文のa,b,cに入れる適切な字句はどれか。
09_1.png/image-size:544×114
〔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
  • 09_2.png/image-size:326×153
            

分類 :

テクノロジ系 » データベース » データ操作

正解 :

解説 :

本問のSQL文は、FROM句で"名簿1"表と"名簿2"表に関係演算を行い、結果セットの行数が0であれば"等しい"、それ以外では"異なる"と結果判定をしています。

"名簿1"表と"名簿2"表が行の集合として等しいと言えるためには、「片方の表だけに属する行が一つもない」という状態を満たす必要があります。この一方にしか含まれない行の集合は、ベン図における A-B と B-A の領域にあたります。
09_3.png/image-size:454×195
集合AとBについて、A-B と B-A の部分を求める方法は次のとおりです。
  1. AとBの和集合を求める
  2. AとBの共通集合を求める
  3. 和集合から共通集合を引く
この3つの操作は (A∪B)-(A∩B) として1つの集合式で表せます。

設問の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行になるので適切です

Pagetop