HOME»応用情報技術者試験掲示板»更新可能なビューのイメージがつかない
投稿する
たとえば、oracleのrowid(物理的なレコードのアドレス)とかpostgresのctidがあるRDBMSを使っているとして、ビューのクエリが
create view sample as SELECT DISTINCT id, name FROM personal
というものを作ったとする
※personalの中身
create table personal(id varchar2(20), name varchar2(50));
データは
rowid,id,name
AAAACOAABAAAAWJAAA,A001,hoge
AAAACOAABAAAAWJAAB,A001,hoge
が入っているとする
sampleから見ると
id,name
A001,hoge
だが、このデータはrowidがAAAACOAABAAAAWJAAAのほうなのかAAAACOAABAAAAWJAABのほうなのか、少なくともrowidの概念のあるRDBMSにおいてもどちらの行を更新するべきなのかの判別ができない。
sql - Why can't we update a view which has DISTINCT Clause in its definition? - Stack Overflow
で、こんな回答があった。
重複した箇所を全部変える、という挙動は、RDBMSとして「ありうる結果」としてあいまいだからこそ、それは
認められない、ということです。
更新可能なビューのイメージがつかない [4397]
八王子さん(No.1)
私の理解では、
『ビューはいくつかの表を掛け合わせた仮想の表のため、ビューを更新すると元になった実表が更新される。故に更新可能なビューは、実表のどこから参照したのか特定できる場合に限る』
…という感じです。確かにSUM関数などを使った合計金額などをビューに表示させた場合、『合計金額』のカラムはどこの実表にもないので更新不可というのは分かります。
では、この問題にあるDISTINCT句及び表を結合して作成したビューなどはなぜ更新不可なのでしょうか?DISTINCTなんて重複した箇所を全部変えればいいだけに思えますが…
また、これらを踏まえると『更新可能ビューは、基本的に1つの実表からカラムを幾つか抜き出す処理しかしていないような、単純なビューにしか出来ない』という認識でいいのでしょうか。
https://www.ap-siken.com/s/kakomon/17_haru/q65.html
『ビューはいくつかの表を掛け合わせた仮想の表のため、ビューを更新すると元になった実表が更新される。故に更新可能なビューは、実表のどこから参照したのか特定できる場合に限る』
…という感じです。確かにSUM関数などを使った合計金額などをビューに表示させた場合、『合計金額』のカラムはどこの実表にもないので更新不可というのは分かります。
では、この問題にあるDISTINCT句及び表を結合して作成したビューなどはなぜ更新不可なのでしょうか?DISTINCTなんて重複した箇所を全部変えればいいだけに思えますが…
また、これらを踏まえると『更新可能ビューは、基本的に1つの実表からカラムを幾つか抜き出す処理しかしていないような、単純なビューにしか出来ない』という認識でいいのでしょうか。
https://www.ap-siken.com/s/kakomon/17_haru/q65.html
2023.08.19 14:35
GinSanaさん(No.2)
★AP プラチナマイスター
この投稿は投稿者により削除されました。(2023.08.19 17:17)
2023.08.19 17:17
GinSanaさん(No.3)
★AP プラチナマイスター
>DISTINCTなんて重複した箇所を全部変えればいいだけに思えますが…
たとえば、oracleのrowid(物理的なレコードのアドレス)とかpostgresのctidがあるRDBMSを使っているとして、ビューのクエリが
create view sample as SELECT DISTINCT id, name FROM personal
というものを作ったとする
※personalの中身
create table personal(id varchar2(20), name varchar2(50));
データは
rowid,id,name
AAAACOAABAAAAWJAAA,A001,hoge
AAAACOAABAAAAWJAAB,A001,hoge
が入っているとする
sampleから見ると
id,name
A001,hoge
だが、このデータはrowidがAAAACOAABAAAAWJAAAのほうなのかAAAACOAABAAAAWJAABのほうなのか、少なくともrowidの概念のあるRDBMSにおいてもどちらの行を更新するべきなのかの判別ができない。
sql - Why can't we update a view which has DISTINCT Clause in its definition? - Stack Overflow
で、こんな回答があった。
Which row should be updated?
Should it be the first row? or the second row? Either could be used as the DISTINCT value. In which case there would still be a DISTINCT row that has the 1, 1 pairing and it would appear that the update had done nothing.
Both the first and second row? So that afterwards there would be no 1, 1 pairing?
The expected behaviour is ambiguous as either result could be a valid solution.
Oracle removes the potential ambiguity by disallowing updates on aggregated/distinct views.
Should it be the first row? or the second row? Either could be used as the DISTINCT value. In which case there would still be a DISTINCT row that has the 1, 1 pairing and it would appear that the update had done nothing.
Both the first and second row? So that afterwards there would be no 1, 1 pairing?
The expected behaviour is ambiguous as either result could be a valid solution.
Oracle removes the potential ambiguity by disallowing updates on aggregated/distinct views.
どの行を更新する必要がありますか?
最初の行にする必要がありますか? それとも2列目? どちらも DISTINCT 値として使用できます。 この場合、1, 1 のペアを持つ DISTINCT 行がまだ存在し、更新によって何も行われなかったように見えます。
1列目と2列目両方? では、その後は 1, 1 のペアリングは存在しないのでしょうか?
どちらの結果も有効な解決策である可能性があるため、期待される動作はあいまいです。
Oracle は、集約ビューまたは個別ビューの更新を禁止することで、潜在的なあいまいさを排除しています。
最初の行にする必要がありますか? それとも2列目? どちらも DISTINCT 値として使用できます。 この場合、1, 1 のペアを持つ DISTINCT 行がまだ存在し、更新によって何も行われなかったように見えます。
1列目と2列目両方? では、その後は 1, 1 のペアリングは存在しないのでしょうか?
どちらの結果も有効な解決策である可能性があるため、期待される動作はあいまいです。
Oracle は、集約ビューまたは個別ビューの更新を禁止することで、潜在的なあいまいさを排除しています。
重複した箇所を全部変える、という挙動は、RDBMSとして「ありうる結果」としてあいまいだからこそ、それは
認められない、ということです。
2023.08.19 17:25
八王子さん(No.4)
な、なるほど…
つまり、
ーーーーーーー
名前、科目、点数
太郎、数学、100
花子、数学、100
ーーーーーーー
からDISTINCTで科目と点数だけ抜き出すと
ーーーーーーー
数学、100
ーーーーーーー
になるが、この数学を書き換えたい場合、『太郎or花子だけ変えたいのか』もしくは『両方変えたいのか』が曖昧だから一律で変更出来ないようにしているという事ですね。
めちゃくちゃ納得できました!ありがとうございます。
つまり、
ーーーーーーー
名前、科目、点数
太郎、数学、100
花子、数学、100
ーーーーーーー
からDISTINCTで科目と点数だけ抜き出すと
ーーーーーーー
数学、100
ーーーーーーー
になるが、この数学を書き換えたい場合、『太郎or花子だけ変えたいのか』もしくは『両方変えたいのか』が曖昧だから一律で変更出来ないようにしているという事ですね。
めちゃくちゃ納得できました!ありがとうございます。
2023.08.19 17:44