3

PostgreSQLで簡単な再帰関数を実装しようとしていますが、完了できません...

列Col1とCol2を含むテーブルMyTableがあります。内部のデータは次のようになります。

Col1 | Col2

1 | 2  
2 | 5 
2 | 6
3 | 7
4 | 5
4 | 2
5 | 3

Col1 fe(1,2)のパラメーター配列として受け取り、次のようにCol2から値を返す関数を作成したいと思います。

1 | 2
2 | 5
2 | 6

そしてその後、結果で再びそれを行います:(2、5、6)そう:

1 | 2
2 | 5
2 | 6
5 | 3

(2はすでに入っており、キー「6」は存在しません)そして再び(3):

1 | 2
2 | 5
2 | 6
5 | 3
3 | 7

(7)値「7」はCol1に存在しないため、何もありません。

簡単な再帰ですが、どのように実装すればよいかわかりません。私はこれまでに次のようなものを持っています:

with recursive aaa(params) as (
    select Col1, Col2
    from MyTable
    where Col1 = params -- I need an array here
    union all
    select Col1, Col2
    from aaa
)
select * from aaa;

しかし、もちろんそれは機能しません

前もって感謝します

4

1 に答える 1

7

再帰の基本的なパターンは、結合の最初の部分として基本ケースを持ち、2 番目の部分で再帰結果を次のレベルの結果を生成するために必要なものに結合することです。あなたの場合、次のようになります。

WITH RECURSIVE aaa(col1, col2) AS (
        SELECT col1, col2 FROM mytable
            WHERE col1 = ANY (ARRAY[1,2]) -- initial case based on an array
    UNION -- regular union because we only want new values
        SELECT child.col1, child.col2
            FROM aaa, mytable AS child -- join the source table to the result
            WHERE aaa.col2 = child.col1 -- the recursion condition
) 
SELECT * FROM aaa;
于 2012-09-17T13:49:03.677 に答える