Previous: サブ・クェリー
Up: サブ・クェリー
Next: existsの使用
Previous Page: サブ・クェリー

selectのネスティング

テーブルのジョインを行うには、もう一つの方法がある。それは、以前の例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」という言葉を書名の一部に含む書籍を出 版している出版社を検索するものである。

例 36: 「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に対応している。

例 37: 「UNIX」に関わる内容の本を検索(サブ・クェリー)

select 書名
	from   書籍台帳
	where  書籍番号 in 
	    (  select  書籍番号
	       from    内容一覧
	       where   内容 like '%UNIX%'
	    )

次の例は、例33での三つのテーブルのジョインに対応している。selectのネストも 三重になっていることに注目せよ。

例 38: 「UNIX」という書籍の著者を検索(サブ・クェリー)

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
1995年02月10日 (金) 00時49分16秒 JST