令和6年度 秋期 午前Ⅱ 問8
データ操作
図のツリー構造に対するデータを格納した“隣接リスト”表から,リーフノードを取得するSQL文のaに入れる字句はどれか。ここで,図の丸はノードを表し,矢印は親ノードから子ノードへの関係を表す。
ツリー構造:
A → B A → C B → D B → E C → F F → G
隣接リスト
| 親ノード | 子ノード |
|---|---|
| NULL | A |
| A | B |
| A | C |
| B | D |
| B | E |
| C | F |
| F | G |
〔SQL文〕
SELECT 子ノード FROM 隣接リスト [ a ] SELECT 親ノード FROM 隣接リスト
- アEXCEPT
- イINTERSECT
- ウUNION
- エUNION ALL
答えと解説を見る
✓ これが正解アEXCEPT
解説
子ノードの集合から親ノードの集合を差し引く EXCEPT で葉が残ります。
リーフノードは、子を持たないノード、つまり子ノードとしては現れるのに、親ノードとしては一度も現れないノードです。前半の SELECT は子ノードの列から A、B、C、D、E、F、G を返し、後半の SELECT は親ノードの列から NULL、A、A、B、B、C、F を返します。前者から後者に含まれるものを取り除く差の演算 EXCEPT を使うと、A、B、C、F が除かれ、D、E、G が残ります。図を見ても、子ノードを持たないのは D、E、G で一致します。見分ける軸は、二つの集合のどちらにあり、どちらにないものを求めるかです。一方にだけあるものは差、両方にあるものは共通部分と対応させて考えましょう。
ほかの選択肢はなぜ違うのか
- イINTERSECT:INTERSECT は両方の結果に共通する値を返すので、子ノードとしても親ノードとしても現れる A、B、C、F が得られます。これは子を持つ内部のノードであり、リーフノードとは逆の集合になります。
- ウUNION:UNION は二つの結果を合わせて重複を除くので、A から G までのすべてのノードと NULL が得られます。子を持つかどうかで絞り込んでいないので、リーフノードだけを取り出すことはできません。
- エUNION ALL:UNION ALL は二つの結果を重複も含めてそのまま合わせるので、すべてのノードが重複を含んで返り、NULL も含まれます。リーフノードだけを選び出す働きはありません。
出典:令和6年度 秋期 データベーススペシャリスト試験 午前Ⅱ 問8
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)