Previous: テーブル名のエイリアス(別名)
Up: ジョイン
Previous Page: テーブル名のエイリアス(別名)

自己自身とのジョイン

テーブル名のエイリアスの機能を用いると一つのテーブルをあたかも二つのテーブルが あるかのように扱う興味深い検索が可能となる。次の例は、利用者台帳から、同じ電話 番号を持つ利用者のペアを選び出そうとするものである。
まずfrom句に注目して欲しい。二つのテーブルが指定されているが、実際には「利用者 台帳」という一つのテーブルに、firstとsecondという二つの別名が与えられている。

例 35: 同じ電話番号の人を検索(自己とのジョイン)

select  first.氏名_姓,first.氏名_名,second.氏名_姓,second.氏名_名
	from    利用者台帳 first , 利用者台帳 second
	where   first.電話番号 = second.電話番号
	        and  first.利用者コード <  second.利用者コード

氏名_姓 氏名_名 氏名_姓 氏名_名 -------------- -------------- -------------- -------------- 矢野 昭司 岡崎 俊雄 岩佐 茂 野村 均 岩佐 茂 永野 昭雄 伊藤 篤志 河野 徹 鳥越 宏 奥井 文男 今村 弘美 今村 均 布施 兆賢 馬場 次郎 舟橋 栄一 岩下 香樹

...............................

原嶋 眞敬 松本 雅宏 矢崎 真 田代 道崇 寺一 隆 甲原 博雄

(290 rows affected)

この検索では、二つの条件が置かれているのだが、最初の条件は、普通のジョインで よく見かけるものである。

where   first.電話番号 = second.電話番号

それでは、次の条件は、どんな働きをしているのだろうか?

and first.利用者コード <  second.利用者コード

この条件部分の働きは、この部分がなければどのような出力が得られるかを考えて 見れば分かる。そうした時、この例では全く同じテーブルのジョインであるから、 例えば、最後の行に現れた「寺一隆」氏と「甲原博雄」氏が同じ電話番号を持つという 出力に対応して、この前後を取り替えた、「甲原博雄」氏と「寺一隆」氏がが同じ電話 番号を持つという出力が現れることになる。また、これらの他にも「甲原博雄」氏と「 甲原博雄」氏が同じ電話番号を持つとか、「寺一隆」氏と「寺一隆」氏が同じ電話番号 を持つといった出力も現れることになる。もちろん、こうした出力は冗長である。 第二番目の条件は、まさに、こうした冗長な出力の抑制をしているのである。 自己自身とのジョインの時には、こうしたやり方を知っておくと便利である。

maruyama@wakhok.ac.jp
1995年02月10日 (金) 00時49分16秒 JST