基本的にJOIN演算子は、2つのテーブルの結合を行う。
3つ以上のテーブルについては、結合した結果に対して次のテーブルを結合することを繰り返す。
g01, g02, g03, c01, c02, c03, s01の各テーブルを元に戻す。
oddtbs=> \i setup121.sql
DROP TABLE
...
SELECT
...
単純なNATURAL JOINによる結合。
oddtbs=> select * from g01 natural join c01 natural join s01 order by gnum, cnum, snum;
gnum | cnum | color | charge | snum | name
------+------+-------+--------+------+--------------
1 | 1 | 青 | 田中 | 1 | 大石友美
1 | 1 | 青 | 田中 | 2 | 中村優作
1 | 1 | 青 | 田中 | 3 | 北川陽子
1 | 1 | 青 | 田中 | 4 | 望月慎太郎
1 | 1 | 青 | 田中 | 5 | 木村葉子
1 | 1 | 青 | 田中 | 6 | 藤田智子
1 | 2 | 青 | 佐藤 | 1 | 石川大地
...
...
3 | 4 | 緑 | 島田 | 4 | 鷲山綾子
3 | 4 | 緑 | 島田 | 5 | 内山絢平
3 | 4 | 緑 | 島田 | 6 | 梶間昇平
(72 rows)
最初のJOINで同名の列が出現してしまい、それを次の結合で使用しようとするためエラー。
oddtbs=> select * from g02 join c01 using(gnum) natural join s01;
ERROR: common column name "cnum" appears more than once in left table
結合する順番を変えて、2.のエラーを回避。
oddtbs=> select * from c01 natural join s01 join g02 using(gnum) order by gnum, s01.cnum, snum;
gnum | cnum | charge | snum | name | cnum | color
------+------+--------+------+--------------+------+-------
1 | 1 | 田中 | 1 | 大石友美 | 100 | 青
1 | 1 | 田中 | 2 | 中村優作 | 100 | 青
1 | 1 | 田中 | 3 | 北川陽子 | 100 | 青
1 | 1 | 田中 | 4 | 望月慎太郎 | 100 | 青
1 | 1 | 田中 | 5 | 木村葉子 | 100 | 青
1 | 1 | 田中 | 6 | 藤田智子 | 100 | 青
1 | 2 | 佐藤 | 1 | 石川大地 | 100 | 青
...
...
3 | 4 | 島田 | 4 | 鷲山綾子 | 100 | 緑
3 | 4 | 島田 | 5 | 内山絢平 | 100 | 緑
3 | 4 | 島田 | 6 | 梶間昇平 | 100 | 緑
(72 rows)
後の結合でONを使用することにより、2.のエラーを回避。
次のSQLをファイルとして作成。(multijoin121.sql)
oddtbs=> \i multijoin121.sql
gnum | cnum | color | cnum | charge | gnum | cnum | snum | name
------+------+-------+------+--------+------+------+------+--------------
1 | 100 | 青 | 1 | 田中 | 1 | 1 | 1 | 大石友美
1 | 100 | 青 | 1 | 田中 | 1 | 1 | 2 | 中村優作
1 | 100 | 青 | 1 | 田中 | 1 | 1 | 3 | 北川陽子
1 | 100 | 青 | 1 | 田中 | 1 | 1 | 4 | 望月慎太郎
1 | 100 | 青 | 1 | 田中 | 1 | 1 | 5 | 木村葉子
1 | 100 | 青 | 1 | 田中 | 1 | 1 | 6 | 藤田智子
1 | 100 | 青 | 2 | 佐藤 | 1 | 2 | 1 | 石川大地
...
...
3 | 100 | 緑 | 4 | 島田 | 3 | 4 | 4 | 鷲山綾子
3 | 100 | 緑 | 4 | 島田 | 3 | 4 | 5 | 内山絢平
3 | 100 | 緑 | 4 | 島田 | 3 | 4 | 6 | 梶間昇平
(72 rows)
ONによる結合。
次のSQLをファイルとして作成。(multijoin122.sql)
oddtbs=> \i multijoin122.sql
num | color | gnum | num | charge | gnum | cnum | snum | name
-----+-------+------+-----+--------+------+------+------+--------------
1 | 青 | 1 | 1 | 田中 | 1 | 1 | 1 | 大石友美
1 | 青 | 1 | 1 | 田中 | 1 | 1 | 2 | 中村優作
1 | 青 | 1 | 1 | 田中 | 1 | 1 | 3 | 北川陽子
1 | 青 | 1 | 1 | 田中 | 1 | 1 | 4 | 望月慎太郎
1 | 青 | 1 | 1 | 田中 | 1 | 1 | 5 | 木村葉子
1 | 青 | 1 | 1 | 田中 | 1 | 1 | 6 | 藤田智子
1 | 青 | 1 | 2 | 佐藤 | 1 | 2 | 1 | 石川大地
...
...
3 | 緑 | 3 | 4 | 島田 | 3 | 4 | 4 | 鷲山綾子
3 | 緑 | 3 | 4 | 島田 | 3 | 4 | 5 | 内山絢平
3 | 緑 | 3 | 4 | 島田 | 3 | 4 | 6 | 梶間昇平
(72 rows)
列の選択・順序、行の順序を指定。
次のSQLをファイルとして作成。(multijoin123.sql)
oddtbs=> \i multijoin123.sql
gnum | cnum | snum | color | charge | name
------+------+------+-------+--------+--------------
1 | 1 | 1 | 青 | 田中 | 大石友美
1 | 1 | 2 | 青 | 田中 | 中村優作
1 | 1 | 3 | 青 | 田中 | 北川陽子
1 | 1 | 4 | 青 | 田中 | 望月慎太郎
1 | 1 | 5 | 青 | 田中 | 木村葉子
1 | 1 | 6 | 青 | 田中 | 藤田智子
1 | 2 | 1 | 青 | 佐藤 | 石川大地
...
...
3 | 4 | 4 | 緑 | 島田 | 鷲山綾子
3 | 4 | 5 | 緑 | 島田 | 内山絢平
3 | 4 | 6 | 緑 | 島田 | 梶間昇平
(72 rows)