HOME»応用情報技術者試験掲示板»R1午後DBの問2eがうまく理解できません・・
投稿する

[3692] R1午後DBの問2eがうまく理解できません・・

 ラストスパート中さん(No.1) 
(e)の答えは、最後が FROM 従業員 で終わっているので
通常のSELECT文の構文のように
そんな列名ありません的なエラーになるのではと
思ってしまいます。

解答の書き方で正しいのは間違いないですが、
どのサイトを見ても詳しい解説がなかったので
こちらに投稿させていただきました。

上記のSQLは別の構文でこう書ける、等
何かうまく理解できる解釈の仕方はありますでしょうか・・?
2022.09.19 18:13
 ラストスパート中さん(No.2) 
問題文は
https://www.ap-siken.com/kakomon/01_aki/pm06.html
です。
2022.09.19 18:19
GinSanaさん(No.3) 
AP プラチナマイスター
バインド変数で、インサート句の列名が明示されているから、これで問題はおきません。インサート句の列名が明示されていない場合は、アズ句で明示しないとダメな場合はあります
2022.09.19 18:23
 ラストスパート中さん(No.4) 
お早いご回答、ありがとうございます。
要するに、問題文でのバインド変数は、
『:レポート年月』  となっているからOKで、
例えば『:れぽーとねんげつ』となっていた場合は、
インサート句の列名が明示されていないことになるのでダメとなるかも、という理解でよいですかね…?
すみません、上手く伝われば幸いです。
2022.09.19 18:42
GinSanaさん(No.5) 
AP プラチナマイスター
・1. 定義が同じテーブルで全件 insert する場合
インサート  イントゥ テーブルa
セレクト  アスタ 
from   テーブルb

・2. 列を指定して insert する場合
インサート  イントゥ テーブルa(
     列1
    ,列2
)
セレクト  列1
      ,列2
from   テーブルb
で、今回は2. 列を指定して INSERT する場合だったわけですけど、この場合insertでも列2(2件目のselectの列)がinsertの列2に当たるんだという書き方になるので、バインド変数のネーミングがどうあれ入るわけですけど、
「1. 定義が同じテーブルで全件 insert する場合」は、selectの結果をinsertするテーブルの列定義に合わせて入れてやらないと入らないので、列名をそろえろよ、ということです。バインド変数の名前がどうあれasで列名にあった名前をつければ済む話なので、asをつけるとはそういうことです。
2022.09.19 19:29
 ラストスパート中さん(No.6) 
GinSanaさま
ご丁寧に解説ありがとうございます。恐れ入ります。
『・2. 列を指定して insert する場合』に問題文が該当することは理解しておりまして、バインド変数の中身って‘202209’みたいな値になるはずなので、

例文に当てはめると
インサート  イントゥ テーブルa(
     列1
    ,列2
)
セレクト  列1
      ,‘202209’
from   テーブルb

となると思います。
これって『‘202209’という列名はテーブルbに存在しません』というエラーになったりしないものでしょうか?
というのが本件の質問したかったところなんです。
2022.09.19 20:01
jjon-comさん(No.7) 
AP プラチナマイスター
INSERT INTO 表X(列A, 列B)
SELECT 列C, 列D FROM 表Y;

というSQL文において,列Cという列名,列Dという列名 は無視されます。

SELECT 列C, 列D FROM 表Y; によって出力される「中身だけ」,
すなわち,2種類の値のデータ型が
格納先の 列A,列B と合っているかだけが問われます。

INSERT INTO 表X(列A, 列B)
VALUES (値1, 値2);

というSQL文が
「VALUES (値1, 値2) には列名が存在せず,値の中身だけ」
であるのに正常動作するのと同じ理屈です。
2022.09.19 23:43
jjon-comさん(No.8) 
AP プラチナマイスター
回答No.7の

> SELECT 列C, 列D FROM 表Y; によって出力される「中身だけ」,
> すなわち,2種類の値のデータ型(中略)だけが問われます。

という説明を,このサイトの解説ではこう表現しています。
https://www.ap-siken.com/kakomon/01_aki/pm06.html

> INSERT INTO句の(  )で列名を指定した場合には、
> その【例の値だけ】を指定すれば足ります。

(例の値,は誤字で,列の値,が適切なように思います。
  が,無断転載への対策として意図してこうしたのかもしれません)
2022.09.19 23:56
GinSanaさん(No.9) 
AP プラチナマイスター
以下はtermuxのsqlite3で実験しました。

sqltest.txt
の中身
クリエートテーブル personal2(id integer, name text);
.parameter init
.parameter set @piyopiyo 'スプラトゥーン3  売り切れました'

BEGIN TRANSACTION;                                                                              インサートイントゥ                                             personal2(id, name)
セレクト
1,
@piyopiyo
;

コミット;
~/.../DL/proj $ sqlite3 myfriend.sqlite3 < sqltest.txt
~/.../DL/proj $ sqlite3 myfriend.sqlite3        SQLite version 3.38.5 2022-05-06 15:25:27
Enter ".help" for usage hints.
sqlite> select アスタ from personal2;
1|スプラトゥーン3  売り切れました
sqlite>
2022.09.20 00:02
GinSanaさん(No.10) 
AP プラチナマイスター
sqliteだとバインド変数が:でなく@なのは仕様なのですが、とりあえずバインド変数名が関係なく入ることはこれでわかると思います。
2022.09.20 00:06
 ラストスパート中さん(No.11) 
GinSanaさま、jjon-comさま
ご丁寧に、回答ありがとうございます。

バインド変数名が何であれ関係なく、"中身だけ"
が格納先の列と合っているかだけが問われる
ことはお二人の説明で理解しました。


一番知りたいところはそこではなく、from句なのです。
jjon-comさまのNo.7の文をお借りしますと、


INSERT INTO 表X(列A, 列B)
SELECT 列C, 列D FROM 表Y;
は、過去問に即すると、
INSERT INTO 月次レポート(従業員番号, レポート年月)
SELECT 従業員番号(①), :レポート年月(②) FROM 従業員(③);
となります。

③従業員テーブルに①従業員番号は存在するので問題ありませんが、
②:レポート年月 なんて列名は③従業員テーブルにありませんので、
構文エラーになるのではないか、と思っています。
FROM句の場所が①と②に係るところにあるので、なんか変な構文になるなあ、と感じました。
2022.09.20 01:45
GinSanaさん(No.12) 
AP プラチナマイスター
>③従業員テーブルに①従業員番号は存在するので問題ありませんが、
>②:レポート年月 なんて列名は③従業員テーブルにありませんので、
>構文エラーになるのではないか、と思っています。

fromで実際のテーブルを指定したらそのテーブルにあるものしか使えないと思ってませんか?
:レポート年月 なんて列名  じゃなくて、あくまで「:レポート年月」が変数名なんです。列名じゃないです。
これが「1」とか固定値だったら、構文エラーになるとか思わないんじゃないですか。固定値だったら、列名がないじゃないかとかいわないじゃないですか。
あとは、固定値をバインド変数に置き換えて考えれば、fromのテーブルに「バインド変数名の列名」がなくてもいいんだとわかるはずです。
2022.09.20 08:25
jjon-comさん(No.13) 
AP プラチナマイスター
> (コロンで始まる)":レポート年月" は,……埋込み変数である

と問題文で説明されています。
「:レポート年月」は 従業員表の中の列名ではありません。

例えば,レポート出力したい年月をパソコンのキーボードから 202209 のように入力し,この入力値をSQL文に渡したいときの変数名,それが埋込み変数です。
2022.09.20 10:12
jjon-comさん(No.14) 
AP プラチナマイスター
この投稿は投稿者により削除されました。(2022.09.20 13:33)
2022.09.20 13:33
jjon-comさん(No.15) 
AP プラチナマイスター
FROMで指定した表から抽出した値ではなく,
まったく別の値を出力できる点については
https://www.ap-siken.com/bbs/3657.html
の回答No.4を参照。
2022.09.20 13:33
jjon-comさん(No.16) 
AP プラチナマイスター
ここまでの説明で,
質問者自身の次の発言(回答No.4)が間違っていることは
分かっていただけたのでしょうか。

> 問題文でのバインド変数は、
> 『:レポート年月』  となっているからOKで、
> 例えば『:れぽーとねんげつ』となっていた場合は、
> インサート句の列名が明示されていないことになるので
> ダメとなるかも、という理解でよいですかね…?

従業員表の中の列名ではないので,
「:レポート年月」でも「:れぽーとねんげつ」でも
好きなように名付けてください。

--------
> インサート句の列名が明示されていないことになるので

という発言でしたが,
インサート句の列名(データ格納先の列名)は次の行で明示されています。

INSERT INTO 月次レポート(従業員番号, レポート年月)

セレクト句は,データ格納先ではなく,データ抽出元です。
データ抽出元の列名は無視され,中身のデータのみが抽出されて,
インサート句(データ格納先)に渡されます。
2022.09.20 14:10
 ラストスパート中さん(No.17) 
お二人とも、ご丁寧に回答ありがとうございました。理解致しました。大変助かりました。引き続き頑張っていこうと思います!
2022.09.21 06:08

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。
© 2010-2024 応用情報技術者試験ドットコム All Rights Reserved.

Pagetop