令和2年度 10月 データベーススペシャリスト試験 午前Ⅱ 問7
テクノロジ/データベース表Rと表Sに対し,SQL文を実行して結果を得るとき,aに入れる字句はどれか。ここで,結果のNULLは値が存在しないことを表す。 〔SQL文〕 SELECT [ a ](R.ID, S.ID) AS ID, 名称1, 名称2 FROM R FULL JOIN S ON R.ID = S.ID ORDER BY ID

出典:令和2年度 10月 データベーススペシャリスト試験 午前Ⅱ 問7
- アCOALESCE
- イDISTINCT
- ウNULLIF
- エUNIQUE
正解:ア
解説
表Rは(ID,名称1)={(1,AAA),(2,BBB),(3,CCC)},表Sは(ID,名称2)={(2,bbb),(3,ccc),(4,ddd)}です。FULL JOINにより,両表のIDが一致する行は結合され,一致しない行はNULLを補って残ります。結合結果でIDを求める際,R.IDとS.IDのどちらか一方がNULLになる行(ID=1の行はS.IDがNULL,ID=4の行はR.IDがNULL)があるため,2つの引数のうち最初の非NULL値を返すCOALESCE関数を使えば,R.IDが非NULLならR.IDを,R.IDがNULLならS.IDを返すことで正しいIDが得られます。実際,ID=1の行はCOALESCE(1, NULL)=1,ID=4の行はCOALESCE(NULL, 4)=4となり,与えられた結果表と一致します。NULLIFは2つの引数が等しい場合にNULLを返す関数であり,NULLIF(NULL, 4)はNULLのままとなるため4行目のIDが得られず不適切です。DISTINCTは重複除去のための修飾子,UNIQUEは重複の有無を判定する述語であり,いずれも2引数から代表値を1つ選ぶ関数ではありません。
選択肢ごとの解説
- ア正しい。COALESCE(R.ID, S.ID)は最初の非NULLの値を返す関数であり,ID=1の行ではR.ID=1(S.IDはNULL)から1を,ID=4の行ではS.ID=4(R.IDはNULL)から4を返すため,結果表のIDと一致します。
- イ誤り。DISTINCTは重複行を除去するための修飾子であり,2つの列の値から代表となる1つの値を選択するための関数ではありません。
- ウ誤り。NULLIF(R.ID, S.ID)は2つの引数が等しいときにNULLを返す関数です。ID=4の行ではR.IDがNULLであるためNULLIF(NULL, 4)はNULLのままとなり,結果表のID=4という値を得ることができません。
- エ誤り。UNIQUEは副問合せの結果に重複行がないかを判定する述語であり,2つの列の値から1つの値を選択して返す関数ではありません。