戦国IT

情報処理技術者試験の過去問対策サイト

データベーススペシャリスト試験 2024年 午前208


図のツリー構造に対するデータを格納した“隣接リスト”表から, リーフノードを取得するSQL文のaに入れる字句はどれか。ここで, 図の丸はノードを表し, 矢印は親ノードから子ノードへの関係を表す。
問題画像
EXCEPT(正解)
INTERSECT
UNION
UNION ALL

解説

隣接リストからリーフノードを取得するSQL文のaに入れる字句はどれか【午前2 解説】

要点まとめ

  • 結論:リーフノードは親ノードに存在するが子ノードに存在しないため、親ノード集合から子ノード集合を除外する必要があります。
  • 根拠:隣接リストでリーフノードは「子ノードとしては存在するが、親ノードとしては存在しない」ノードです。
  • 差がつくポイント:集合演算の中で「差集合」を表す
    EXCEPT
    を使うことで、親ノードから子ノードを除外しリーフノードを正確に抽出できます。

正解の理由

リーフノードは「子ノードとしては存在するが、親ノードとしては存在しない」ノードです。
SQLでリーフノードを取得するには、親ノードの集合から子ノードの集合を差し引く必要があります。
EXCEPT
はSQLで差集合を表す演算子であり、親ノード集合から子ノード集合を除外するのに最適です。
したがって、
a
に入る字句は
EXCEPT
が正解です。

よくある誤解

UNION
INTERSECT
は集合の和や積を求めるため、リーフノードの抽出には適しません。
UNION ALL
は重複を除かず結合するため、リーフノードの正確な抽出ができません。

解法ステップ

  1. 隣接リストの「親ノード」列から全ての親ノードを抽出する。
  2. 同じく「子ノード」列から全ての子ノードを抽出する。
  3. 親ノード集合から子ノード集合を差し引くことで、親ノードとして存在しない子ノード(リーフノード)を特定する。
  4. SQLの集合演算子
    EXCEPT
    を使い、親ノード集合から子ノード集合を除外するSQL文を作成する。
  5. 結果としてリーフノードのみが抽出される。

選択肢別の誤答解説

  • ア: 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, ツリー構造, 差集合, データベース設計
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ