あるかないか、早く判断する (単純なCOUNT(*)より早く)

とにかく今、プリンが食べたいとしよう。
理由はともかく、何にせよ今はプリンなのだ。

プリンを探す冷蔵庫は以下のような定義だ。
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
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。