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

ichikawa @ is.ocha.ac.jp ichikawa @ is.ocha.ac.jp
2002年 5月 24日 (金) 14:02:35 JST


市川です.

At Fri, 24 May 2002 12:27:12 +0900,
WADA Hiroyuki wrote:
> 
> 和田です。
> 
> "K.Ohyama" wrote:
> 
> >  それならアプリケーション側で3回 SELECT してもらう方が手っ取り早くて
> > 無駄が無いっすね。
> 
> そのとおりで、
> 
> >  今回やろうとしているのは6つテーブルがあったため、
> > 「6回も SELECT させるのもどうだか...」
> > って思ったわけなんですが...。
> 
> もともと無関係なテーブルを結合させる方が無駄だと思います。
> 
> 無理やりこんなこともできなくもないですが、ソートされてしまいます。
> (iが重複するとだめです。)
> 
> SELECT t1.count,t1.i,t1.j,t2.i,t2.j,t3.i,t3.j 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 t1
> 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 t2
> ON(t1.count=t2.count)
> 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 t3
> ON(t1.count=t3.count)

すばらしいです.でもこれですと,例えば

  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 の
タプル数に応じて切り換えないとだめです.
(t1.count=t3.count or t2.count=t3.count 使えるかな
とも思ったのですが,7.1.3 ではエラーにあるようです.
7.2 では試しておりませんが.)

--市川



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