Previous: サブ・クェリー
Up: サブ・クェリー
Next: existsの使用
Previous Page: サブ・クェリー
テーブルのジョインを行うには、もう一つの方法がある。それは、以前の例21で簡単に
見てきたが、select文の内部で再びselect文を用いる方法である。
/* 例 21 */ select 出版社 , 出版地 from 出版社一覧 where 出版地 in ( select 都道府県名 from 都道府県名一覧 where 地方 = '東北地方' )
ここでのselectのネスティングでは、次の
where 項目名 in ( select 項目名 from ..... )
という形が特徴的である。ここでの二つの項目は、もちろん、同じタイプに属さなけれ
ばならない。加えて、内側のselect文は、一つの項目のみを返すものでなければならな
いことに注意されたい。
逆に、こうした要件が満たされていれば、in 以外の比較演算子を置くことも可能であ
る。例えば、
where 項目名 = ( select 項目名 from ..... ) where 項目名 < ( select 項目名 from ..... ) where 項目名 > ( select 項目名 from ..... ) .........
といった形式でのサブ・クェリーが可能である。
次の例は、例31とほとんど同じ、「UNIX」という言葉を書名の一部に含む書籍を出 版している出版社を検索するものである。
select distinct 出版社 from 出版社一覧 where 出版社コード in ( select 出版社コード from 書籍台帳 where 書名 like '%UNIX%' )出版社 -------------------- 技術評論社 HBJ出版局 スターリング UNIXシステムラボラトリー 日本ソフトバンク 丸善 サイエンス社 アスキー 秀和システムトレーディング スペック 日刊工業新聞社 日経BP社
概念的には、最も内側のselect文から実行が行われる。この例では、書籍台帳という
テーブルから、UNIXという文字列を含む書名の本が選ばれ、その出版社コードが、返さ
れる。通常は、select文の出力は、テーブルを形成するのだが、このselectのネスティ
ングでは、内側のselectの出力は、まずリストとして解釈される。ここでは、内側の
select文の出力は、条件を満たす出版社コードのリストを形成して、where句の中で、
今度は、出版社一覧のテーブル中の出版社コードの項目と比較される。
ここでのdistinctは、あい異なる出版社のみを出力する働きを持つ。UNIXに関する本を
二冊出版している会社を二度カウントする必要はないからである。この点では、書名
と出版社の双方を出力した例31の出力とは異なる。
次の例は、例32に対応している。
select 書名 from 書籍台帳 where 書籍番号 in ( select 書籍番号 from 内容一覧 where 内容 like '%UNIX%' )
次の例は、例33での三つのテーブルのジョインに対応している。selectのネストも 三重になっていることに注目せよ。
select 著者名 from 著者コード一覧 where 著者コード in ( select 著者コード from 書籍著者対応表 where 書籍番号 in ( select 書籍番号 from 書籍台帳 where 書名 like '%UNIX%' ) )著者名 -------------------- 中原 紀 木下 恂 アスキー 伊藤 雅俊 奥田 一人 戸川 隼人 佐々木 整 小嶋 隆一 植村 富士夫 K.ハヴィランド Paul Wang B.Anderson S.G.Kochan Eric Foxle」 LUNAユーザグルー S.J.Leffle David A.Cu」 Mike Louki」 Rebecca Th」 Douglas W.」 UNIXシステムラボ
maruyama@wakhok.ac.jp