平成27年秋期 午前問29

のまえさん  
(No.1)
https://www.ap-siken.com/kakomon/27_aki/q29.html

問題文と主問い合わせは理解できましたが、副問い合わせの選択肢の違いが、手元に参考書もあるのにさらに解説を読んでも以下の引用文がよく分かりません。

解説
ア"単一の値と比較することを前提とした比較演算子の"="だとエラーになります。"
?何と何が比較

イ"1つの商品コードが結果セットの商品コードの集合の全て(ALL)と一致することはないため、主問合せのWHERE句の条件にマッチする行は存在しません。"
?結果セットとは
?一致しないと言い切れるのはなぜ

ウ"主問合せの各行の商品コードに対して、副問合せの結果セットに含まれるかを判定することで集計対象となる行のみに絞り込みができます。"
?副問い合わせの前に主問い合わせの表が出来てるってことか

エ"副問合せは1行以上の結果セットを返しEXISTSは常に真と判定されるため、条件による絞り込みが機能しません。"
?EXISTSは常に真と判定されるため、条件による絞り込みが機能しません。という流れが意味が分からない

長文すみません。
2023.07.02 22:39
jjon-comさん 
AP プラチナマイスター
(No.2)
副問合せの実行で得られるデータの具体例を仮定してみます。

(SELECT 商品コード FROM 倉庫別商品在庫集計
     WHERE 倉庫番号 = 'C003' AND 在庫数 >= 100)

というSQLの実行によって得られるデータ(商品コードの値の羅列)が
('S001', 'S002', 'S003') だと仮定します。これが結果セットです。

ア  商品コード = ('S001', 'S002', 'S003')
「=」は単一の値と比較することを前提とした比較演算子なので文法エラー。
「=」は,主問合せにおける各行の商品コードの値と,副問合せの結果セットを比較しています。

イ  商品コード = ALL ('S001', 'S002', 'S003')
「= ALL」は1つ以上の値との比較を可能にする比較演算子です。
'S001', 'S002', 'S003'のすべてと同時に一致する単一値は存在しないので
この条件式はいつでも 偽(false) になる。
よって主問合せにおけるどの行に対しても いつも偽(false)になります。

ウ  商品コード IN ('S001', 'S002', 'S003')
    商品コード = ANY ('S001', 'S002', 'S003')
「IN」と「= ANY」も1つ以上の値との比較を可能にする比較演算子です。
どちらも同じ意味で「いずれかの値と一致するときに 真(true)」です。

エ  今回,副問合せの実行で得られるデータは3件だと仮定しました。
ですから「副問合せの結果が存在するか (EXISTS)」の結果は 真(true)です。
主問合せにおけるどの行に対しても いつも真(true)になるため,
> 倉庫番号'C003'の倉庫で在庫数が100以上の商品に対して
のみ主問合せを実行したい,という条件による絞り込みは機能しません。
2023.07.03 18:02
のまえさん  
(No.3)
言い換えていただき誠にありがとうございます。
やっと理解できました。丁寧な解説ありがとうございました。
2023.07.03 21:27
jjon-comさん 
AP プラチナマイスター
(No.4)
説明しやすいタイミングなので,
1つ以上の値と比較する場合に用いられる ANY と ALL について補足しておきます。

ANY は = とペアにして「= ANY (…)」という形式がよく用いられます。
「列挙した値のいずれか1つと等しい ならば 真(true)」という意味になり
「IN (…)」と同じ意味になります。

それに対して。

ALL は <> とペアにして「<> ALL (…)」という形式がよく用いられます。
「列挙した値のすべてと等しくない ならば 真(true)」という意味になり
「NOT IN (…)」と同じ意味になります。

逆の見方をするならば。
「<> ANY (…)」は どのデータに対しても 真(true)
「 = ALL (…)」は どのデータに対しても 偽(false) になってしまう
変な意味の日本語になるので,この選択肢は不正解だと判断できます。
2023.07.04 00:25

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。

その他のスレッド


Pagetop