平成29年春期午後問6

マイムさん  
(No.1)
平成29年春期午後問6について、以下2点、確認させて頂きたいのですが、

①図3のSQL文において、7行目の「DISTINCT」はなぜ必要なのでしょうか?

②図2のE-R図ですが、申請書項目エンティティにおいて、主キーが「申請書項目ID」のみなのはなぜでしょうか?
「項目キー」が「申請書項目ID」で一意に定まるのは納得がいくのですが、「項目値」を特定するためには「申請書ID」も決まる必要があると思っています。
また、「申請書項目ID」は主キーとなっていますが、同じ項目でも、申請書(「申請書ID」)が異なれば、「申請書項目ID」は変わってくるのでしょうか?

以上、よろしくお願い致します。
2023.08.09 22:40
jjon-comさん 
AP プラチナマイスター
(No.2)
> 「申請書項目ID」は主キーとなっていますが、同じ項目でも、
> 申請書(「申請書ID」)が異なれば、「申請書項目ID」は変わってくるのでしょうか?

はい、申請書項目IDが主キーだと言っているのですから、そうなります。

新たに1件の稟議申請書が作成される際、新たに申請書IDの番号が1つ生み出される。
そのタイミングで、
(例としてその稟議申請書に5つの項目があるのならば)
新たに5件の申請書項目が作成され、新たに申請書項目IDの番号が5つ生み出される。
ということになります。

--------
> 「項目キー」が「申請書項目ID」で一意に定まるのは納得がいくのですが、
> 「項目値」を特定するためには「申請書ID」も決まる必要があると思っています。

申請書項目IDが上記で説明されたようなものであるなら、
申請書項目IDが決まれば、申請書IDも書式IDも決まりますから、項目値を特定できます。
--------
> ①図3のSQL文において、7行目の「DISTINCT」はなぜ必要なのでしょうか?

申請書.申請書ID IN (SELECT DISTINCT 申請書ID FROM …略…
において、同じ申請書IDの値が複数出力されてもIN句は問題なく動作しますから、DISTINCTがなくても結果は変わらないはずです。
2023.08.10 00:06
jjon-comさん 
AP プラチナマイスター
(No.3)
応用情報技術者過去問題 平成29年春期 午後問6
https://www.ap-siken.com/kakomon/29_haru/pm06.html
2023.08.10 00:22
マイムさん  
(No.4)
jjon-com様
ご回答ありがとうございます。
②については解決致しました。

①について、私の方で考え直してみたのですが、以下の疑問点が生じました。
・「DISTINCT」を使用しても、結果が変わらないとのことですが、この結果とは、図3のSQL文全体の実行結果のことでしょうか?
7行目の「SELECT」以降のみの結果だとすると、1つの承認申請で、ユーザIDが埋め込み変数「ユーザID」である人が2回以上承認を担当する場合(そのようなことはあるのでしょうか)、申請書IDが重複するため、DISTINCTの有無によって実行結果が変化するかと思いました。
・承認申請IDと申請書IDは1:1対応しているかと思いますが、このことは、承認申請エンティティと申請書エンティティが1:1の関係であるためである、と理解しても差し支えないでしょうか?
多くの場合、同じ名前のキー項目で紐づけられている2つエンティティについて、主キー側の多重度が1、外部キー側の多重度が多であるかと思いますが、承認申請エンティティと申請書エンティティについてはこの例外に当てはまるいうことでしょうか?

長文となり申し訳ございません。
恐れ入りますが、よろしくお願い致します。
2023.08.11 06:43
jjon-comさん 
AP プラチナマイスター
(No.5)
> ユーザIDが埋め込み変数「ユーザID」である人が
> 2回以上承認を担当する場合(そのようなことはあるのでしょうか)

問題文にこう書いてあります。

> 購買稟議の場合は,申請者の所属部署の部長,購買部の担当者,
> 購買部の部長の順で,承認が必要となる。また,契約稟議の場合は,
> 申請者の直属の上司,所属部署の部長の順で,承認が必要となる。

この記述から、申請者が購買部に所属する社員である場合は、
申請者の所属部署の部長 は 購買部の部長 と同一人物になります。
また、申請者が課長である場合は、
申請者の直属の上司 が 所属部署の部長 と同一人物になります。
どちらも、1つの申請書に対して同一人物による承認が2回おこなわれます。

----
> 2回以上承認を担当する場合、申請書IDが重複するため、
> DISTINCTの有無によって実行結果が変化するかと思いました。

いいえ、変わりません。

申請書.申請書ID IN (SELECT DISTINCT 申請書ID FROM …略…

という、内側のSELECT文(通常の副問合せ)の実行によって
出力される申請書IDの値の羅列の具体例が、
申請書.申請書ID IN ('SSS11', 'SSS11', 'SSS22', 'SSS22' 'SSS33', 'SSS33')
であろうが
申請書.申請書ID IN ('SSS11', 'SSS22', 'SSS33')
であろうが、
> 同じ申請書IDの値が複数出力されてもIN句は問題なく動作しますから、
> DISTINCTがなくても結果は変わらないはずです。(回答No.2)

----
> 承認申請IDと申請書IDは1:1対応しているかと思いますが、
> このことは、承認申請エンティティと申請書エンティティが
> 1:1の関係であるためである、と理解しても差し支えないでしょうか?

はい、その理解で良いでしょう。

> 多くの場合、同じ名前のキー項目で紐づけられている
> 2つエンティティについて、主キー側の多重度が1、
> 外部キー側の多重度が多であるかと思います

はい、その理解で良いでしょう。

> 承認申請エンティティと申請書エンティティについては
> この例外に当てはまるいうことでしょうか?

はい、そうなります。
このデータベースの設計者は、
図1のような申請書を構成する要素と、
申請書の状態('承認中', '可決', '否決')とは、
別表に分けたほうが良いと考えたことになります。

ちなみに、問題文の次の記述からは、

> 稟議申請が否決された場合,
> 申請者は内容を修正して再度申請するか,
> 申請を取りやめるかを判断する。

申請書と承認申請が1対1であることから、
「内容を修正して」というのは、古い申請書IDを維持したまま内容を新しく修正し、新たな承認申請IDの値を与えて新たな申請とする★のではない★(これだと申請書と承認申請が1対多になるので)
ことが推測できます。

内容を新しく修正した申請書に新たな申請書IDの値を与えて、その状態を表す承認申請IDの値も新たに与える、ということになります。
2023.08.12 02:11
マイムさん  
(No.6)
jjon-com様

「DISTINCT」の有無による実行結果の違いの件ですが、
「DISTINCT」の有無に関わらず、図3の7行目の「申請書.申請書ID」との比較対象になる「IN句内の副問合せの実行結果として出力される申請書IDの種類(数ではない)」は同じになるため、実行結果は変わらない、という理解で正しいでしょうか?

承認申請エンティティと申請書エンティティの多重度などについては解決致しました。
詳細なご解説ありがとうございます。
2023.08.12 08:40
jjon-comさん 
AP プラチナマイスター
(No.7)
> 「IN句内の副問合せの実行結果として出力される申請書IDの種類
> (数ではない)」は同じになるため、実行結果は変わらない、
> という理解で正しいでしょうか?

はい、その理解で正しいです。

> 「DISTINCT」はなぜ必要なのでしょうか?(No.1)

というのが元々のご質問でしたので、DISTINCTの有無によらず
最終的に得られる実行結果は同じになる、ことを示しましたが、
出題どおり、DISTINCTが有る方がスマートなSQL文だと思います。
2023.08.12 09:57

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop