Previous: selectのネスティング
Up: サブ・クェリー
Previous Page: selectのネスティング
サブ・クェリーの中で、
where exists ( select ..... ) where not exists ( select ..... )
といった形式が使われることがある。
この形式では、内側のselectが、行を見つけることに成功すれば、existsは真を返す。 逆に、not exists は、内側のselectが検索に失敗した時に、真を返す。これまで見て きたサブ・クェリーとは異なって、外側のselectは内側のselectの返す項目の値を使わ ないので、existsは、通常、次の形式で用いられる。
where exists ( select * from ..... ) where not exists ( select * from ..... )
次の例は、existsを用いた、「データベース」という文字を含む書名の書籍を出版した 出版社の検索例である。ほとんど同じ検索である、例31(ジョイン)、例36(inを用い たサブ・クェリー)と比較して欲しい。 この例では、内側のselect文が、テーブルとしては書籍台帳しか指定していないのに、 「出版社一覧.出版社コード」という形で、外側のselect文のテーブルの修飾を受けて いることに注目せよ。
select 出版社 from 出版社一覧 where exists ( select * from 書籍台帳 where 書名 like '%データベース%' and 出版社コード = 出版社一覧.出版社コード )出版社 -------------------- HBJ出版局 オーム社 サイエンス社 JICC出版局 ダイヤモンド社 東洋経済新報社 日本科学技術情報セン 日本電気文化センター パワー社 パーソナルメディア 丸善 学術情報センター 関西データベース協議 教科書研究センター データベース振興セン 山田常雄氏追悼論集刊
(16 rows affected)
この形式が威力を発揮するのは、次のような検索の場合である。 今、ISBNを持つ本を一度も出版したことのない、小さな出版社を検索するとしよう。 まず、ISBNを持つ本の書籍番号とISBNの対からなるテーブル「ISBN一覧」の 書籍番号と書籍台帳の書籍番号を比較して、「ISBN一覧」に存在する (exists)書籍番号を持つ行を書籍台帳の中で選択する。ついで、こうして選ば れた行の中の出版社コードを、出版社一覧の出版社コードとを比較して、前者に存在 しない(not exists)コードを持つ出版社一覧の行から、項目「出版社」を出力すれば いい。
select 出版社 from 出版社一覧 where not exists ( select * from 書籍台帳 where 出版社コード = 出版社一覧.出版社コード and exists ( select * from ISBN一覧 where 書籍番号 = 書籍台帳.書籍番号 ) )
maruyama@wakhok.ac.jp