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