HOME»応用情報技術者試験掲示板»午後データベース問題「UNION」も正解です 被害者の会
投稿する

午後データベース問題「UNION」も正解です 被害者の会 [5552]

 TAKAさん(No.1) 
午後のデータベース問題でIPAの公式解答が UNION ALL という物になっている箇所があります。
しかしここは UNION でも成立するというのが過去スレで検証されていて問題文上で「UNION ALLであるべき状況」が指定や制限された記載がないため UNION も正解になるはずです。

公式解答のUNION ALLだけでしか正解にならないという姿勢はいかがなものでしょうか?

仮に試験作成者がUNION ALLを正解の意図で作った問題だったとしても作成した問題の方に不備があってどっちも成立したのであれば UNION も正解になるべきです。

このようなことは抗議の声を上げていかないと今後も不備のある問題に惑わされる事象がかんたんに発生し見過ごされてしまい、是正されずに流れてしまうと思います。
私達受験者が不誠実な状況に流されず受験者の権利を守るためにもUNIONも正解であると声高に主張していかなければいけないと思います。
資格試験なのですから他の部分でも作問ミスなどを見つけたらそれは訂正されるべきですし必ず指摘していくべきだと思っています。
今回の試験において言えば UNION ALL と UNION の複数解答が存在したという扱いにするべきです。
2024.12.27 17:09
GinSanaさん(No.2) 
AP プラチナマイスター
この投稿は投稿者により削除されました。(2024.12.27 17:44)
2024.12.27 17:44
GinSanaさん(No.3) 
AP プラチナマイスター
まあ、主キーとかを見ると、結果としては一緒なんだろうな、とは思います。実際には、マルになってるんじゃないでしょうか。
ただ、「再帰で」UNION DISTINCTにするのは、まず聞かないな・・・とは思います。それは、RDBMSの実装にもよりますが、UNION DISTINCTには罠があるからです。

sql server - Why does a Recursive CTE in Transact-SQL require a UNION ALL and not a UNION? - Stack Overflow
A UNION would require a sort operation in the background which might modify the result of previous iterations. The program should not change the state of a previous call in the call stack, it should interact with it using input parameters and the result of the subsequent iteration (in a procedural setting). This probably should apply to set based operations, thus to SQL Server's recursive CTEs.
UNION では、バックグラウンドでソート操作が必要になり、以前の反復処理の結果が修正される可能性があります。プログラムは、コール スタック内の以前の呼び出しの状態を変更してはならず、入力パラメータと後続の反復処理の結果 (手続き型設定) を使用して、その呼び出しと対話する必要があります。これは、おそらくセット ベースの操作、つまり SQL Server の再帰 CTE に適用されるはずです。
A good explanation of pred post speculation here :

Optimization note: ...... Very little memory is needed to run the above example. However, if the example had used UNION instead of UNION ALL, then SQLite would have had to keep around all previously generated content in order to check for duplicates. For this reason, programmers should strive to use UNION ALL instead of UNION when feasible.
最適化に関する注意: ...... 上記の例を実行するのに必要なメモリはごくわずかです。ただし、例で UNION ALL ではなく UNION を使用した場合、SQLite は重複をチェックするために、以前に生成されたすべてのコンテンツを保持する必要がありました。このため、プログラマーは、可能な場合は UNION ではなく UNION ALL を使用するように努める必要があります。
今のところ、(再帰)CTE(中間テーブル)でUNION DISTINCTをやめてよ、とはっきり言っているマニュアルはSnowflakeくらいですが、一応IPAの試験では理屈の問題でメモリ無限大で思考できるでしょうが、実際にはパフォーマンスでどう考えてもまずい選択なので、実生活ではUNION ALLを使った方がいいです。
再帰的な CTE では、 UNION ではなく UNION ALL を使用してください。
※docs.snowflake.com/ja/sql-reference/constructs/with
2024.12.27 17:45
GinSanaさん(No.4) 
AP プラチナマイスター
この投稿は投稿者により削除されました。(2024.12.27 18:50)
2024.12.27 18:50
GinSanaさん(No.5) 
AP プラチナマイスター
UNION では、バックグラウンドでソート操作が必要になり、以前の反復処理の結果が修正される可能性があります。
の補足について
どのタイミングでソート処理が走るか?にもよるが、仮に
WITH RECURSIVE REC(HOGE, FUGA) AS (
SELECT HOGE, FUGA FROM PIYO
UNION
SELECT HOGE, FUGA FROM REC WHERE(・・・)
)
で、SELECT HOGE, FUGA FROM PIYOを処理し、n回目のSELECT HOGE, FUGA FROM REC WHERE(・・・)を処理したタイミングでソート処理が走り、重複が入った場合、SELECT HOGE, FUGA FROM PIYOの結果とn回目のSELECT HOGE, FUGA FROM REC WHERE(・・・)の結果、どちらが消えるのか?という問題がある(頭の中で演算しているうちは、気にならないかもしれない)。仮にSELECT HOGE, FUGA FROM PIYOの場合、無限ループが発生する。
それは、WITH RECURSIVEによる再帰というのは、n回目のSELECT HOGE, FUGA FROM REC WHERE(・・・)の結果セットに対して積み上げていくので、n回目のSELECT HOGE, FUGA FROM REC WHERE(・・・)の結果セットがいつまでたっても消えなくなってしまうから。で、問題は、何のレコードが何の経緯で来たのかを認識できないと、SELECT HOGE, FUGA FROM PIYOのやつじゃ困るから再帰対象側でヨロシク、とかしないとならないわけだが、それはまあできない(集合論的操作でそんなことを内部でしているとは思えない)。UNION DISTINCT自体がダメ(データセットにもよるが)な理由を一般的にいうと、こういうことになると思う。

2つ目
n回目のSELECT HOGE, FUGA FROM REC WHERE(・・・)の結果セットに対して積み上げていくので、取得した段階のリザルトセットの順序をsort+uniqすると、内部の各行に対する呼出処理がおかしくなる可能性がある。
当時は深く考えていませんでしたが、言われてみると、結構根深い問題な感じはします。
2024.12.27 18:50
DTさん(No.6) 
> 公式解答のUNION ALLだけでしか正解にならないという姿勢はいかがなものでしょうか?

不勉強で申し訳ないですが、この「公式解答の ... しかならない」は誰が公開している情報なのでしょうか?

IPA は「解答例」と公表しています。

https://www.ipa.go.jp/shiken/mondai-kaiotu/m42obm000000afqx-att/2024r06a_ap_pm_ans.pdf

この問題が間違っていても、午後は 60 点以上を超える点数を取れば合格できるのですから「被害者の会」「受験者の権利を守る」「不誠実な状況」「声高に主張していかなければいけない」等は個人的には考えすぎだと思います。
2024.12.27 18:52
krtyさん(No.7) 
落ちたのか知らんけど必死すぎでしょ
あくまでも解答例だし点入ってると考えるのが普通でしょ
2024.12.27 18:57
 TAKAさん(No.8) 
問題の状況設定に対し UNION ALL でも UNION でも同じ結果が成立して問題の設定上どちらも成立するのでどちらでも正解であろうという話が焦点です。
パフォーマンスがどうこうは触れていません。
パフォーマンスを考慮した実装が必要ならそれを問題文で制約として書いて指定するべきことです。
指定が漏れているのですからパフォーマンスどうこうを考慮に入れる必要はありません。

令和6年春のセキュリティ解答の問題にいい例があるので置いておきます。
https://www.ipa.go.jp/shiken/mondai-kaiotu/m42obm000000afqx-att/2024r06h_ap_pm_ans.pdf

↑こちらを開いてすぐ見える解答例の問1設問4 (2)に
 「多要素認証 又は 2要素認証 (多段階認証 又は 2段階認証も可)」
という解答がありました。
その問題を解いて記述する際にいろんな書き方が想定される、それは普通のことです。
記述式試験なのですから同じ問いに答えるにしてもいろんな書き方が現れてきます。

記述式の試験で複数解答が成立する問題であったのであれば複数のいずれの解答でも正しいとするべきなんです。
しかし今回のデータベース問題は UNION ALL だけを正解かのように書いているのでそこに問題があるという話です。
複数解答が成立する問題になってしまっていましたということで UNION でも正解にするべきです。
UNION ALL だけが正解とするのであればとても疑義のある試験問題になってしまうと思います。
2024.12.27 19:09
GinSanaさん(No.9) 
AP プラチナマイスター
それを言い出すと、where条件や結合条件なんかは毎回hoge = fugaとfuga = hoge、tbl1.hoge = fugaとか考えられるもの全部書いとけ、と似てくると思いますよ。
2024.12.27 19:15
16歳さん(No.10) 
私もUNIONと回答しましたが自己採点よりもかなり点数が高かったのでUNIONでもマルになってると思いますよ。
問8設問1 Cの解答例も多相性ですがポリモーフィズムでもマルになると思いますしあくまで回答例なのだと思います。
2024.12.27 19:16
DTさん(No.11) 
> UNION ALL だけを正解かのように書いている
それは、あなたの主観・感想です。
繰り返しますが、IPA が公開しているのは「解答例」です。

この「解答例」に「この解答のみ正解とする」と明記されていますか?
私が確認した限りではそのような内容は記載されておりませんでした。

「事実」と「主観・感想」を分けて記載いただければ、より TAKA さんの思いは通じると思います。
2024.12.27 19:21
GinSanaさん(No.12) 
AP プラチナマイスター
なんかパフォーマンスの話しかしてないじゃないか、みたいに言われるとアレなので一応書いときますが、今回はたまたま重複がないからUNIONでもいいというのは既に書いていて、それを抜きにしてUNIONのままでいいかというと、重複排除の際にどこの結果セットから排除するのかを標準SQL(CTEがSQL2008からだからそれ以降で)で定義していないから、一般的には危険な選択肢だろう、ということを申し上げています。
2024.12.27 19:39
合格者さん(No.13) 
この投稿は投稿者により削除されました。(2025.01.17 12:18)
2025.01.17 12:18
ぱなきさん(No.14) 
TAKAはゆっくり寝て頭冷やすべき
2024.12.28 02:53
あいさん(No.15) 
私の場合、UNIONがバツで自己採点したところ59点で、結果は見事に59点でした。
おそらく点は入ってないと思います。
部分点もなしです。
理系セットを選んでるのでブレはほぼありません。
2024.12.28 05:59
ぱなきさん(No.16) 
あいは配点も公表されてない中で何を根拠に59なんてピンポイントの数字で自己採点の結果を示しとるんや…
2024.12.28 10:34
ああいさん(No.17) 
UNIONで丸になってるよ多分
自分は自己採点した最高点より高かったし
2024.12.28 12:01
うおさん(No.18) 
実力不足で不合格なのに何が被害者の会じゃ
2024.12.28 17:39
もっちんさん(No.19) 
UNIONって答えたけど結局受かったので結果オーライです
2024.12.28 19:47
返信投稿用フォームスパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
© 2010- 応用情報技術者試験ドットコム All Rights Reserved.

Pagetop