[pgsql-jp: 26120] Re: 3つ以上のテーブルを無条件に結合する方法

WADA Hiroyuki wada @ komine-ag.co.jp
2002年 5月 24日 (金) 15:28:03 JST


和田@ど根性です。

ichikawa @ is.ocha.ac.jp wrote:
> 
> 市川です.

>   insert t3 values (7, 'a')
> 
> とかをした後には,
> 
>  count | i | j | i | j | i | j
> -------+---+---+---+---+---+---
>      1 | 0 | a | 0 | c | 3 | c
>      2 | 1 | b | 2 | b | 5 | d
>        |   |   | 4 | a |   |
>        |   |   |   |   | 7 | a
> (4 rows)
> 
> となってしまいます.つまり,t1.count=t3.count を使うか,
> t2.count=t3.count を使うのかを,t1 と t3 の
> タプル数に応じて切り換えないとだめです.

いきなり3つJOINせず、最初の2つをJOINしたものに3つめをJOINする。
countがNULLにならないようにcoalesceを使う。
これでいけるでしょう。

SELECT coalesce(t12.count,t3c.count) AS count,
    t1i,t1j,t2i,t2j,t3c.i,t3c.j FROM
(SELECT coalesce(t1c.count,t2c.count) AS count,
    t1c.i AS t1i,t1c.j AS t1j,t2c.i AS t2i,t2c.j AS t2j FROM
 (SELECT count(*),t1a.* FROM t1 AS t1a, t1 AS t1b
  WHERE t1a.i >= t1b.i
  GROUP BY t1a.i,t1a.j
  ORDER BY t1a.i 
 ) AS t1c
 FULL JOIN
 (SELECT count(*),t2a.* FROM t2 AS t2a, t2 AS t2b
  WHERE t2a.i >= t2b.i
  GROUP BY t2a.i,t2a.j
  ORDER BY t2a.i 
 ) AS t2c
 ON(t1c.count=t2c.count)
) AS t12
FULL JOIN
(SELECT count(*),t3a.* FROM 
 t3 AS t3a, t3 AS t3b
 WHERE t3a.i >= t3b.i
 GROUP BY t3a.i,t3a.j
 ORDER BY t3a.i 
) AS t3c
ON(t12.count=t3c.count)

同じ名前のカラムがあるのでASが増えて長くなってしまいましたが。



pgsql-jp メーリングリストの案内