[pgsql-jp: 33822] Re: 効率的なSQL について(

SAKATA Tetsuo sakata.tetsuo @ lab.ntt.co.jp
2004年 8月 5日 (木) 08:15:52 JST


おはようございます。坂田@横須賀は曇っています

SUGIMURA Takashi 杉村貴士 wrote:
>>  そうなんですよね。そもそも、SQLは再起処理を行なうには言語仕様と
>> して無理があると思うのですよ。
> 
> 再起ではなく再帰だと思いますが、
> SQL99 にある WITH RECURSIVE 句はどうなのでしょうか。

泥縄で参考書[1]を勉強してみました。

もとのデータ構造は;

Message-Id: <20040804104644.8D46.MLMLML @ lily.freemail.ne.jp>
From: shima tetuo <mlmlml @ lily.freemail.ne.jp>
Date: Wed, 04 Aug 2004 10:58:21 +0900
> --------------
> table_network
> --------------
> name | connected_to
>
> 下記が上記の例のA起点からのデータとなります。
> ※BCDEそれぞれの起点用のデータも同じように必要になります。
> ------
> A | B
> B | C
> B | D
> C | E
> ------

でしたから、WITH RECURSIVE句を使うと、以下のように書けると思います。

WITH RECURSIVE tansitive_closure (outgoing, incomming) AS
  (  -- この部分が再帰問合せのスタートとなる行データ《種》を作る
     SELECT *
     FROM table_network
   UNION
     -- 以下の部分が「友達の友達」を順次手繰っていく
     SELECT *
     FROM transitive_closure  -- ここが再帰
     WHERE outgoing = incomming
  )
SELECT *
FROM transitive_closure;

従来のSQL(92)では、この種の問合せは記述できなかったので、
SQL99では大きく進歩したと言えそうです。

[1] Jim Melton, Alan Simon (芝野ほか訳), "SQL:1999 リレーショナル言語詳解",
    ピアソン・エデュケーション, 2003. (原著は1999)
-- 
坂田 哲夫@NTT サイバースペース研究所
sakata.tetsuo _at_ lab.ntt.co.jp
SAKATA, Tetsuo. Yokosuka JAPAN.




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