令和2年秋期午後問6
広告
あーるえるさん
(No.1)
https://www.ap-siken.com/kakomon/02_aki/pm06.html
図6のSQL文でなぜ問題文に記載のような抽出ができるのかわからないので質問させていただきます。
私の考えた状況は下記のとおりです。
・現在、予約は予約IDが1~20の20件ある
・予約ID7と8、および13と14の明細にそれぞれ同じ部屋・同じ宿泊日のレコードが存在する
このような時に、図6のSQLを実行すると、
①副問い合わせのほうのセレクト文が実行される
②副問い合わせの結果は7となり、もとの文のWHEREはt1.予約ID>7となる
③予約明細表のうち予約IDが7を超える全てのレコードが抽出される
となり、部屋・宿泊日の重複の有無にかかわらず、初めて重複したデータ以降すべてのデータが出力されてしまうような気がするのですが...。
図6のSQL文でなぜ問題文に記載のような抽出ができるのかわからないので質問させていただきます。
私の考えた状況は下記のとおりです。
・現在、予約は予約IDが1~20の20件ある
・予約ID7と8、および13と14の明細にそれぞれ同じ部屋・同じ宿泊日のレコードが存在する
このような時に、図6のSQLを実行すると、
①副問い合わせのほうのセレクト文が実行される
②副問い合わせの結果は7となり、もとの文のWHEREはt1.予約ID>7となる
③予約明細表のうち予約IDが7を超える全てのレコードが抽出される
となり、部屋・宿泊日の重複の有無にかかわらず、初めて重複したデータ以降すべてのデータが出力されてしまうような気がするのですが...。
2024.09.13 12:54
こはさん
(No.2)
この投稿は投稿者により削除されました。(2024.09.13 13:29)
2024.09.13 13:29
こはさん
(No.3)
この投稿は投稿者により削除されました。(2024.09.13 13:30)
2024.09.13 13:30
こはさん
(No.4)
誤解を恐れずに言うと、「t1とt2は直積の関係」にあるから問題文が意図しているデータを抽出可能なのだと思います。
●イメージ
①クエリの前半「SELECT ~ FROM 予約明細 t1 ~」で、予約明細のデータをすべて取得します。
--------------------------------------------------
ⅰ:t1の行「U」(予約ID:7)
ⅱ:t1の行「V」(予約ID:7)
ⅲ:t1の行「W」(予約ID:8)
ⅳ:t1の行「X」(予約ID:13)
ⅴ:t1の行「Y」(予約ID:14)
ⅵ:t1の行「Z」(予約ID:14)
--------------------------------------------------
②①で取り出したデータに対して、サブクエリの内容「SELECT MIN(t2.予約ID) FROM 予約明細 t2 WHERE ~」を当てはめます。
--------------------------------------------------
ⅰ:t1の行「U」(予約ID:7)をサブクエリに当てはめる→サブクエリから予約ID7が取得される。
ⅱ:t1の行「V」(予約ID:7)をサブクエリに当てはめる→サブクエリから予約ID7が取得される。
ⅲ:t1の行「W」(予約ID:8)をサブクエリに当てはめる→サブクエリから予約ID7が取得される。
ⅳ:t1の行「X」(予約ID:13)をサブクエリに当てはめる→サブクエリから予約ID13が取得される。
ⅴ:t1の行「Y」(予約ID:14)をサブクエリに当てはめる→サブクエリから予約ID13が取得される。
ⅵ:t1の行「Z」(予約ID:14)をサブクエリに当てはめる→サブクエリから予約ID13が取得される。
--------------------------------------------------
③②の内容から、クエリの前半のWHERE句に当てはまるものだけを残します。
--------------------------------------------------
ⅰ:t1の行「U」(予約ID:7)をサブクエリに当てはめる→サブクエリから予約ID7が取得される。×
ⅱ:t1の行「V」(予約ID:7)をサブクエリに当てはめる→サブクエリから予約ID7が取得される。×
ⅲ:t1の行「W」(予約ID:8)をサブクエリに当てはめる→サブクエリから予約ID7が取得される。○
ⅳ:t1の行「X」(予約ID:13)をサブクエリに当てはめる→サブクエリから予約ID13が取得される。×
ⅴ:t1の行「Y」(予約ID:14)をサブクエリに当てはめる→サブクエリから予約ID13が取得される。○
ⅵ:t1の行「Z」(予約ID:14)をサブクエリに当てはめる→サブクエリから予約ID13が取得される。○
--------------------------------------------------
④最終、↓の結果が得られる。
--------------------------------------------------
ⅲ:t1の行「W」(予約ID:8)
ⅴ:t1の行「Y」(予約ID:14)
ⅵ:t1の行「Z」(予約ID:14)
--------------------------------------------------
質問の回答になっていますでしょうか?
気になる点があればご指摘いただけると幸いです。
以上です。
●イメージ
①クエリの前半「SELECT ~ FROM 予約明細 t1 ~」で、予約明細のデータをすべて取得します。
--------------------------------------------------
ⅰ:t1の行「U」(予約ID:7)
ⅱ:t1の行「V」(予約ID:7)
ⅲ:t1の行「W」(予約ID:8)
ⅳ:t1の行「X」(予約ID:13)
ⅴ:t1の行「Y」(予約ID:14)
ⅵ:t1の行「Z」(予約ID:14)
--------------------------------------------------
②①で取り出したデータに対して、サブクエリの内容「SELECT MIN(t2.予約ID) FROM 予約明細 t2 WHERE ~」を当てはめます。
--------------------------------------------------
ⅰ:t1の行「U」(予約ID:7)をサブクエリに当てはめる→サブクエリから予約ID7が取得される。
ⅱ:t1の行「V」(予約ID:7)をサブクエリに当てはめる→サブクエリから予約ID7が取得される。
ⅲ:t1の行「W」(予約ID:8)をサブクエリに当てはめる→サブクエリから予約ID7が取得される。
ⅳ:t1の行「X」(予約ID:13)をサブクエリに当てはめる→サブクエリから予約ID13が取得される。
ⅴ:t1の行「Y」(予約ID:14)をサブクエリに当てはめる→サブクエリから予約ID13が取得される。
ⅵ:t1の行「Z」(予約ID:14)をサブクエリに当てはめる→サブクエリから予約ID13が取得される。
--------------------------------------------------
③②の内容から、クエリの前半のWHERE句に当てはまるものだけを残します。
--------------------------------------------------
ⅰ:t1の行「U」(予約ID:7)をサブクエリに当てはめる→サブクエリから予約ID7が取得される。×
ⅱ:t1の行「V」(予約ID:7)をサブクエリに当てはめる→サブクエリから予約ID7が取得される。×
ⅲ:t1の行「W」(予約ID:8)をサブクエリに当てはめる→サブクエリから予約ID7が取得される。○
ⅳ:t1の行「X」(予約ID:13)をサブクエリに当てはめる→サブクエリから予約ID13が取得される。×
ⅴ:t1の行「Y」(予約ID:14)をサブクエリに当てはめる→サブクエリから予約ID13が取得される。○
ⅵ:t1の行「Z」(予約ID:14)をサブクエリに当てはめる→サブクエリから予約ID13が取得される。○
--------------------------------------------------
④最終、↓の結果が得られる。
--------------------------------------------------
ⅲ:t1の行「W」(予約ID:8)
ⅴ:t1の行「Y」(予約ID:14)
ⅵ:t1の行「Z」(予約ID:14)
--------------------------------------------------
質問の回答になっていますでしょうか?
気になる点があればご指摘いただけると幸いです。
以上です。
2024.09.13 13:30
あーるえるさん
(No.5)
ご回答ありがとうございます。
理解できました。
理解できました。
2024.09.13 14:07
広告
返信投稿用フォーム
スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
広告