とにかく今、プリンが食べたいとしよう。
理由はともかく、何にせよ今はプリンなのだ。
プリンを探す冷蔵庫は以下のような定義だ。
CREATE TABLE 冷蔵庫
(
品物コード VARCHAR2(50),
賞味期限 DATE,
個数 NUMBER(3,0),
品物分類名 VARCHAR2(50),
メーカー名 VARCHAR2(50),
ブランド名 VARCHAR2(50),
格納日時 DATE,
)
CONSTRAINT 冷蔵庫_PK PRIMARY KEY (品物コード,賞味期限) USING INDEX;
さて、ここでプリンが一つでも冷蔵庫に入っているのか、一つも入っていないのかを判断する場合に、
SELECT COUNT(*)
FROM 冷蔵庫
WHERE 品物分類名 = 'プリン';
で0か否か判断すればタイプ数は短くすむが、非効率である。
プッチンプリンだろうが北海道焼プリンだろうが、プリンならなんでもいいし、
賞味期限が一番長いプリンを選ぶことに頓着しないのだ。
しかし、このSQLではブランドや賞味期限は見ていないが、プリンが全部でいくつあるか、
冷蔵庫全体を調べてしまっている。
こんなことをしては冷蔵庫が温まってしまうし、開けっ放しと判断されて警告音が鳴ってしまう。
ではどうするかというと、以下のようなSQLを発行する。
SELECT COUNT(*)
FROM DUAL
WHERE EXISTS
(SELECT 0
FROM 冷蔵庫
WHERE 品物分類名 = 'プリン');
これでプリンが見つかった時点で1がフェッチされる。
メインクエリ側はCOUNT(*)でなくてもよいが、プロシージャ内では0件のエラー処理が必要になったりするので、
集計関数を使った方が楽。
最終更新:2011年04月26日 16:34