SQLにおけるEXISTS述語を用いた相関副問合せと行数計算

SQL 文の WHERE 句にある副問合せの条件を確認します。 副問合せ: SELECT 製品番号 FROM 在庫 WHERE 在庫数 > 30 AND 製品.製品番号 = 在庫.製品番号 この副問合せは,「在庫数が 30 を超える倉庫が存在する製品」を返します。外側の WHERE 句は NOT EXISTS なので,「在庫数が 30 を超える倉庫が一つも存在しない製品(または在庫表に全く存在しない製品)」が選択されます。 各製品番号について検証します。 AB1805: WH101 で在庫数 150(> 30)が存在するため,副問合せは行を返す(NOT EXISTS は偽 $\rightarrow$ 除外) CC5001: WH100 で在庫数 200,WH103 で 40(いずれも > 30)が存在するため,副問合せは行を返す(NOT EXISTS は偽 $\rightarrow$ 除外) MZ1000: 在庫表にレコードが 1 件も存在しないため,副問合せは空(0行)となり,NOT EXISTS は真 $\rightarrow$ 抽出される XZ3000: WH101 で在庫数 30(30 超ではない),WH102 で 20(30 超ではない)であり,在庫数 > 30 を満たす倉庫が存在しないため,副問合せは空となり,NOT EXISTS は真 $\rightarrow$ 抽出される ZZ9900: WH100 で在庫数 130(> 30)が存在するため,副問合せは行を返す(NOT EXISTS は偽 $\rightarrow$ 除外) 抽出される製品番号は「MZ1000」と「XZ3000」の 2 行です。したがって得られる表の行数は 2 であり,正解はイとなります。 製品番号 在庫数(倉庫ごと) 30を超える在庫 NOT EXISTS 結果 AB1805 20, 150 ある 偽 除外 CC5001 200, 40 ある 偽 除外 MZ1000 (在庫表に無い) 無い 真 抽出 XZ3000 30, 20 無い(30は超えない) 真 抽出 ZZ9900 130, 10 ある 偽 除外

“製品”表と“在庫”表に対し,次の SQL 文を実行した結果として得られる表の行数は幾つか。

SELECT DISTINCT 製品番号 FROM 製品  WHERE NOT EXISTS (SELECT 製品番号 FROM 在庫   WHERE 在庫数 > 30 AND 製品.製品番号 = 在庫.製品番号)

製品

製品番号

製品名

単価

AB1805

CD-ROM ドライブ

15,000

CC5001

デジタルカメラ

65,000

MZ1000

プリンタ A

54,000

XZ3000

プリンタ B

78,000

ZZ9900

イメージスキャナ

98,000

在庫

倉庫コード

製品番号

在庫数

WH100

AB1805

20

WH100

CC5001

200

WH100

ZZ9900

130

WH101

AB1805

150

WH101

XZ3000

30

WH102

XZ3000

20

WH102

ZZ9900

10

WH103

CC5001

40

出典令和5年度 秋期 応用情報技術者試験 午前 問29
ア
1
イ
2
ウ
3
エ
4