データベーススペシャリスト 2024年 午前2 問08
問題文
図のツリー構造に対するデータを格納した“隣接リスト”表から、リーフノードを取得するSQL文のaに入れる字句はどれか。ここで、図の丸はノードを表し、矢印は親ノードから子ノードへの関係を表す。

選択肢
ア:EXCEPT(正解)
イ:INTERSECT
ウ:UNION
エ:UNION ALL
隣接リストからリーフノードを取得するSQL文のaに入れる字句はどれか【午前2 解説】
要点まとめ
- 結論:リーフノードは親ノードに存在するが子ノードに存在しないため、親ノード集合から子ノード集合を除外する必要があります。
- 根拠:隣接リストでリーフノードは「子ノードとしては存在するが、親ノードとしては存在しない」ノードです。
- 差がつくポイント:集合演算の中で「差集合」を表す
EXCEPT
を使うことで、親ノードから子ノードを除外しリーフノードを正確に抽出できます。
正解の理由
リーフノードは「子ノードとしては存在するが、親ノードとしては存在しない」ノードです。
SQLでリーフノードを取得するには、親ノードの集合から子ノードの集合を差し引く必要があります。
したがって、
SQLでリーフノードを取得するには、親ノードの集合から子ノードの集合を差し引く必要があります。
EXCEPTはSQLで差集合を表す演算子であり、親ノード集合から子ノード集合を除外するのに最適です。
したがって、
aに入る字句は
EXCEPTが正解です。
よくある誤解
UNIONや
INTERSECTは集合の和や積を求めるため、リーフノードの抽出には適しません。
UNION ALLは重複を除かず結合するため、リーフノードの正確な抽出ができません。
解法ステップ
- 隣接リストの「親ノード」列から全ての親ノードを抽出する。
- 同じく「子ノード」列から全ての子ノードを抽出する。
- 親ノード集合から子ノード集合を差し引くことで、親ノードとして存在しない子ノード(リーフノード)を特定する。
- SQLの集合演算子
EXCEPT
を使い、親ノード集合から子ノード集合を除外するSQL文を作成する。 - 結果としてリーフノードのみが抽出される。
選択肢別の誤答解説
- ア: EXCEPT
正解。親ノード集合から子ノード集合を除外しリーフノードを抽出できる。 - イ: INTERSECT
親ノードと子ノードの共通部分を抽出するため、リーフノードは得られない。 - ウ: UNION
親ノードと子ノードの和集合を取得し、リーフノードの抽出には不適切。 - エ: UNION ALL
重複を除かず全ての親ノードと子ノードを結合するため、リーフノードの特定ができない。
補足コラム
隣接リストはツリー構造を表現する代表的な方法で、親ノードと子ノードの関係をテーブルで管理します。
リーフノードは子を持たない末端のノードであり、SQLで抽出する際は集合演算を活用することが多いです。
リーフノードは子を持たない末端のノードであり、SQLで抽出する際は集合演算を活用することが多いです。
EXCEPTはSQL標準の差集合演算子で、Oracleでは
MINUSに相当します。
FAQ
Q: なぜ
A:
INTERSECTではリーフノードが抽出できないのですか?
A:
INTERSECTは両方の集合に共通する要素を抽出するため、親ノードと子ノードの両方に存在するノードが対象となり、リーフノード(親ノードに存在しない子ノード)は含まれません。
Q:
A:
UNIONと
UNION ALLの違いは何ですか?
A:
UNIONは重複を除いて結合しますが、
UNION ALLは重複を除かず全ての行を結合します。リーフノード抽出にはどちらも適しません。
関連キーワード: 隣接リスト、リーフノード、SQL集合演算、EXCEPT, ツリー構造、差集合、データベース設計

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

