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

選択肢
ア:EXCEPT(正解)
イ:INTERSECT
ウ:UNION
エ:UNION ALL
隣接リストからリーフノードを取得するSQL文のaに入れる字句はどれか【午前2 解説】
正解の理由
リーフノードは「子ノードとしては存在するが、親ノードとしては存在しない」ノードです。
SQLでリーフノードを取得するには、親ノードの集合から子ノードの集合を差し引く必要があります。
したがって、
SQLでリーフノードを取得するには、親ノードの集合から子ノードの集合を差し引く必要があります。
EXCEPTはSQLで差集合を表す演算子であり、親ノード集合から子ノード集合を除外するのに最適です。したがって、
aに入る字句はEXCEPTが正解です。解法ステップ
- 隣接リストの「親ノード」列から全ての親ノードを抽出する。
- 同じく「子ノード」列から全ての子ノードを抽出する。
- 親ノード集合から子ノード集合を差し引くことで、親ノードとして存在しない子ノード(リーフノード)を特定する。
- SQLの集合演算子
EXCEPTを使い、親ノード集合から子ノード集合を除外するSQL文を作成する。 - 結果としてリーフノードのみが抽出される。
選択肢別の誤答解説
- ア: EXCEPT
正解。親ノード集合から子ノード集合を除外しリーフノードを抽出できる。 - イ: INTERSECT
親ノードと子ノードの共通部分を抽出するため、リーフノードは得られない。 - ウ: UNION
親ノードと子ノードの和集合を取得し、リーフノードの抽出には不適切。 - エ: UNION ALL
重複を除かず全ての親ノードと子ノードを結合するため、リーフノードの特定ができない。
よくある誤解
UNIONやINTERSECTは集合の和や積を求めるため、リーフノードの抽出には適しません。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, ツリー構造、差集合、データベース設計

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

