3つ以上のJOIN

基本的にJOIN演算子は、2つのテーブルの結合を行う。
3つ以上のテーブルについては、結合した結果に対して次のテーブルを結合することを繰り返す。

準備

g01, g02, g03, c01, c02, c03, s01の各テーブルを元に戻す。

oddtbs=> \i setup121.sql
DROP TABLE
...
SELECT
...

様々な例

  1. 単純な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)
    
  2. 最初のJOINで同名の列が出現してしまい、それを次の結合で使用しようとするためエラー。

    oddtbs=> select * from g02 join c01 using(gnum) natural join s01;
    ERROR:  common column name "cnum" appears more than once in left table
    
  3. 結合する順番を変えて、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)
    
  4. 後の結合で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)
    
  5. 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)
    
    
  6. 列の選択・順序、行の順序を指定。

    次の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)