HOME»応用情報技術者試験掲示板»令和元年秋期午後問6設問2(g)
投稿する
update selectの副問い合わせを使った構文だから、としかいいようがないですが、
テーブル名1.列名Xに対して、テーブル名2.列名Xが対象レコードに対して一意に決まるようにWHEREの条件を定義する必要がある
ということ。
複数行取得してしまうとどの行の値を更新値とすればいいのかわからないので、エラーになる。
テーブル名の修飾が不要だから省略しているだけで(UPDATEから見れば見えるテーブルは月次レポートしかないから)、サブクエリとぶつけるときは従業員番号の持ち主の区別がつかないから修飾しているだけです。
省略すると、RDBMSは勝手に構文解析の段階で補完します。補完の手間がかかるから、CPUの負荷を減らす意味で意識的に書いてやるべきなんですけどね。
たぶん登場するテーブルでカラム名が被らなかったんじゃないですかね。そうであれば可能です。
令和元年秋期午後問6設問2(g) [2799]
hogeさん(No.1)
https://www.ap-siken.com/kakomon/01_aki/pm06.html
(g)の解答を
歩数.従業員番号 = 従業員番号
にしたのですが、なぜ
歩数.従業員番号 = 月次レポート.従業員番号
なのでしょうか。
こうであるならば、図3の一番下の行でも
月次レポート.レポート年月 = :レポート年月
でないといけない気がしますが・・・
主キーであるか否かの違いでしょうか。
(g)の解答を
歩数.従業員番号 = 従業員番号
にしたのですが、なぜ
歩数.従業員番号 = 月次レポート.従業員番号
なのでしょうか。
こうであるならば、図3の一番下の行でも
月次レポート.レポート年月 = :レポート年月
でないといけない気がしますが・・・
主キーであるか否かの違いでしょうか。
2021.09.07 22:46
GinSanaさん(No.2)
★AP プラチナマイスター
この投稿は投稿者により削除されました。(2021.09.07 23:12)
2021.09.07 23:12
GinSanaさん(No.3)
★AP プラチナマイスター
>なぜ歩数.従業員番号 = 月次レポート.従業員番号なのでしょうか。
update selectの副問い合わせを使った構文だから、としかいいようがないですが、
UPDATE
テーブル名1
SET
テーブル名1.列名1 = (
SELECT
テーブル名2.列名2
FROM
テーブル名2
WHERE
テーブル名1.列名X = テーブル名2.列名X
);
ポイントは、テーブル名1
SET
テーブル名1.列名1 = (
SELECT
テーブル名2.列名2
FROM
テーブル名2
WHERE
テーブル名1.列名X = テーブル名2.列名X
);
テーブル名1.列名Xに対して、テーブル名2.列名Xが対象レコードに対して一意に決まるようにWHEREの条件を定義する必要がある
ということ。
複数行取得してしまうとどの行の値を更新値とすればいいのかわからないので、エラーになる。
>こうであるならば、図3の一番下の行でも月次レポート.レポート年月 = :レポート年月
テーブル名の修飾が不要だから省略しているだけで(UPDATEから見れば見えるテーブルは月次レポートしかないから)、サブクエリとぶつけるときは従業員番号の持ち主の区別がつかないから修飾しているだけです。
省略すると、RDBMSは勝手に構文解析の段階で補完します。補完の手間がかかるから、CPUの負荷を減らす意味で意識的に書いてやるべきなんですけどね。
2021.09.07 23:12
hogeさん(No.4)
Ginsanaさん
いつの問題だったかは忘れてしまいましたが、テーブル名を記述しないで列名だけで結合していた問題があった気がするのですが、テーブル名を省略するのはどんな場合なのでしょうか??
いつの問題だったかは忘れてしまいましたが、テーブル名を記述しないで列名だけで結合していた問題があった気がするのですが、テーブル名を省略するのはどんな場合なのでしょうか??
2021.09.08 00:00
GinSanaさん(No.5)
★AP プラチナマイスター
>テーブル名を記述しないで列名だけで結合していた問題があった気がする
たぶん登場するテーブルでカラム名が被らなかったんじゃないですかね。そうであれば可能です。
2021.09.08 07:19
hogeさん(No.6)
なるほど、カラム名がかぶらなければOKなんですね。
ありがとうございます。
ありがとうございます。
2021.09.08 20:07