HOME»基本情報技術者試験掲示板»平成21年春期午後問3
投稿する
それは、図が縦の3点リーダーで省略されているだけで、あくまでもテーブルレイアウトはこんな構図だよ、ととらえてください。だから、じゃがいもを使った料理だろうが豚肉を使った料理だろうが、みたいな。
シーケンス番号で1から100万まであって、図表に省略を書いているのと一緒です。あくまでも例示である、ということと、自分で頭の中で補完することを意識してください。
(まあ、ほんとに「じゃがいもを使った料理が登録されていない」なら、他の要素をSQLのwhere句に書くと思いますけど。)
平成21年春期午後問3 [2602]
koさん(No.1)
翔太さん(No.2)
この投稿は投稿者により削除されました。(2021.01.05 20:02)
2021.01.05 20:02
GinSanaさん(No.3)
★FE シルバーマイスター
空レコードが返ってきます。
以下はoracleでやった場合
CREATE TABLE 商品表
(
商品ID VARCHAR(10),
商品名 VARCHAR(10),
種別 VARCHAR(10),
在庫 NUMBER
);
CREATE TABLE 分量表
(
料理ID VARCHAR(10),
商品ID VARCHAR(10),
分量 VARCHAR(10)
);
CREATE TABLE 料理表
(
料理ID VARCHAR(10),
料理名 VARCHAR(10),
作り方 VARCHAR(100)
);
SELECT
料理表.料理名
FROM
料理表
LEFT JOIN
分量表
ON
料理表.料理ID = 分量表.料理ID
LEFT JOIN
商品表
ON
分量表.商品ID = 商品表.商品ID
WHERE
商品表.在庫 != 0
AND
商品表.商品名 = 'じゃがいも';
selectで引くのは料理表の料理名なので、
ビーフカレーかロールキャベツが返ってきます。
テーブルをjoin(とりあえずleft joinで)すると、
・・・・・
料理名
ビーフカレー
ビーフカレー
ビーフカレー
ロールキャベツ
・・・・・
こんな結果が返ってきます。
で、わかりづらいので項目を増やしてやると
・・・・・
料理ID 料理名 作り方 料理ID_1 商品ID 分量 商品ID_1 商品名 種別 在庫
0001 ビーフカレー 大きめに以下略 0001 000001 中1本 000001 にんじん 野菜 1
0001 ビーフカレー 大きめに以下略 0001 000002 中3個 000002 玉ねぎ 野菜 1
0001 ビーフカレー 大きめに以下略 0001 001001 200グラム 001001 牛肉 肉 1
0002 ロールキャベツ みじん切り以下略 NULL NULL NULL NULL NULL NULL NULL
・・・・・
それで、
WHERE
商品表.在庫 != 0
AND
商品表.商品名 = 'じゃがいも';
だと、在庫が0以外は満たす(ここで、nullは0ではないことに留意)が、
商品名が「じゃがいも」のレコードはいないので、空レコードが返ってきます。
なお、
<>は、ANSIやISOが決めたSQL92とかSQL99みたいな、標準規格の比較演算子で、
!=はDMBS(OracleとかPostgresみたいな)側による独自定義か拡張の比較演算子で、意味は一緒です。
DB2もOracleもPostgreSQLもMySQLもFirebirdもみんな実装していますから、
問題ないよ、と。
以下はoracleでやった場合
CREATE TABLE 商品表
(
商品ID VARCHAR(10),
商品名 VARCHAR(10),
種別 VARCHAR(10),
在庫 NUMBER
);
CREATE TABLE 分量表
(
料理ID VARCHAR(10),
商品ID VARCHAR(10),
分量 VARCHAR(10)
);
CREATE TABLE 料理表
(
料理ID VARCHAR(10),
料理名 VARCHAR(10),
作り方 VARCHAR(100)
);
SELECT
料理表.料理名
FROM
料理表
LEFT JOIN
分量表
ON
料理表.料理ID = 分量表.料理ID
LEFT JOIN
商品表
ON
分量表.商品ID = 商品表.商品ID
WHERE
商品表.在庫 != 0
AND
商品表.商品名 = 'じゃがいも';
selectで引くのは料理表の料理名なので、
ビーフカレーかロールキャベツが返ってきます。
テーブルをjoin(とりあえずleft joinで)すると、
・・・・・
料理名
ビーフカレー
ビーフカレー
ビーフカレー
ロールキャベツ
・・・・・
こんな結果が返ってきます。
で、わかりづらいので項目を増やしてやると
・・・・・
料理ID 料理名 作り方 料理ID_1 商品ID 分量 商品ID_1 商品名 種別 在庫
0001 ビーフカレー 大きめに以下略 0001 000001 中1本 000001 にんじん 野菜 1
0001 ビーフカレー 大きめに以下略 0001 000002 中3個 000002 玉ねぎ 野菜 1
0001 ビーフカレー 大きめに以下略 0001 001001 200グラム 001001 牛肉 肉 1
0002 ロールキャベツ みじん切り以下略 NULL NULL NULL NULL NULL NULL NULL
・・・・・
それで、
WHERE
商品表.在庫 != 0
AND
商品表.商品名 = 'じゃがいも';
だと、在庫が0以外は満たす(ここで、nullは0ではないことに留意)が、
商品名が「じゃがいも」のレコードはいないので、空レコードが返ってきます。
なお、
<>は、ANSIやISOが決めたSQL92とかSQL99みたいな、標準規格の比較演算子で、
!=はDMBS(OracleとかPostgresみたいな)側による独自定義か拡張の比較演算子で、意味は一緒です。
DB2もOracleもPostgreSQLもMySQLもFirebirdもみんな実装していますから、
問題ないよ、と。
2021.01.05 16:09
koさん(No.4)
GinSanaさん
じゃがいもを使った料理が登録されていないから空レコードが返されるということでしょうか?
(おそらく私の理解が間違っていると思いますが。。。)
じゃがいもを使った料理が登録されていないから空レコードが返されるということでしょうか?
(おそらく私の理解が間違っていると思いますが。。。)
2021.01.05 17:39
GinSanaさん(No.5)
★FE シルバーマイスター
Koさん
そういうことです。共通するキーでレコードをくっつけていって、最後にwhere句で絞り込みを行うので、じゃがいもを使った料理がない(料理表のレコードにじゃがいもが出てこない)以上は、そうなります。
そういうことです。共通するキーでレコードをくっつけていって、最後にwhere句で絞り込みを行うので、じゃがいもを使った料理がない(料理表のレコードにじゃがいもが出てこない)以上は、そうなります。
2021.01.06 07:41
GinSanaさん(No.6)
★FE シルバーマイスター
まあ、図表の見える範囲でテーブルとレコード作って実演しただけなので、図表がもう少しレコードがあったら、じゃがいもが関連する料理表レコードも拾えたでしょうけど、
使用する食材すべてについて在庫がある料理名だけを表示できるように商品表を変更する。
って問題文の制約にはどうやってもアではたどりつかない。
たとえば、にんじんと玉ねぎ、じゃがいもを使うカレーがあるとして、じゃがいもの在庫は1、にんじんの在庫が1、玉ねぎの在庫は0とする。アだと、じゃがいもが関連するカレーのレコードは返ってくるが、本来は玉ねぎの在庫が0だから、返ってこられてはこまるわけです。
使用する食材すべてについて在庫がある料理名だけを表示できるように商品表を変更する。
って問題文の制約にはどうやってもアではたどりつかない。
たとえば、にんじんと玉ねぎ、じゃがいもを使うカレーがあるとして、じゃがいもの在庫は1、にんじんの在庫が1、玉ねぎの在庫は0とする。アだと、じゃがいもが関連するカレーのレコードは返ってくるが、本来は玉ねぎの在庫が0だから、返ってこられてはこまるわけです。
2021.01.06 07:55
GinSanaさん(No.7)
★FE シルバーマイスター
それで、先にそういうのを絞れないアとイが弾かれて、後はウとエだけど、
ウだとIN句で在庫が0の食材に絞り込みをかけにいくから、逆でしょ、ということで、NOT IN句のエです。
ウだとIN句で在庫が0の食材に絞り込みをかけにいくから、逆でしょ、ということで、NOT IN句のエです。
2021.01.06 08:01
koさん(No.8)
GinSanaさん
制約の文言を見落としておりました。。。
ただ、じゃがいもを使った料理が登録されていないという点では、エも空のレコードが返却されるという認識で問題ありませんか?
制約の文言を見落としておりました。。。
ただ、じゃがいもを使った料理が登録されていないという点では、エも空のレコードが返却されるという認識で問題ありませんか?
2021.01.07 17:33
GinSanaさん(No.9)
★FE シルバーマイスター
>ただ、じゃがいもを使った料理が登録されていないという点では、エも空のレコードが返却されるという認識で問題ありませんか?
それは、図が縦の3点リーダーで省略されているだけで、あくまでもテーブルレイアウトはこんな構図だよ、ととらえてください。だから、じゃがいもを使った料理だろうが豚肉を使った料理だろうが、みたいな。
シーケンス番号で1から100万まであって、図表に省略を書いているのと一緒です。あくまでも例示である、ということと、自分で頭の中で補完することを意識してください。
(まあ、ほんとに「じゃがいもを使った料理が登録されていない」なら、他の要素をSQLのwhere句に書くと思いますけど。)
2021.01.07 18:45