2011-09-20 23 views
1

我有下面定義的遞歸方法:PostgreSQL的:申請查詢返回的功能

with recursive temp(id, s, r, e) as (
    select * 
    from rel 
    where rel_to_id = <parameter from sql query> 

    union all 

    select * 
    from temp P 
    inner join relationship C on P.r = C.s 
) 

,我需要把這種對各行從SQL查詢與遞歸查詢定義的列值返回(標記爲)

我真的不想通過python調用X查詢,這會降低速度,必須有一種方法可以在sql中完成。我試圖在plpgsql中編寫一個函數,但是我無法定義返回類型setof TABLE,並且每次都將它聯合起來。

+0

標記爲?我猜是吧? –

+0

沒有返回類型「setof TABLE」。它可以是「TABLE」或「SETOF」。見[這裏](http://www.postgresql.org/docs/current/static/sql-createfunction.html) –

回答

0

我不確定我是否完全理解這個問題,您的問題是根據您的返回值調用遞歸函數的初始值是否超過1。

在這種情況下,你可以用所有必需的值立即創建你的初始表,然後遞歸通過它?這樣的事情:

with recursive temp(id, s, r, e) as (
    select * 
    from rel r 
    join <sql query> q on r.rel_to_id = q.id 

    union all 

    select * 
    from temp P 
    inner join relationship C on P.r = C.s 
) 
+1

雖然不一定需要成爲JOIN。可能是一個簡單的'where rel_to_id IN(select some_id from some_value)' –

0

恕我直言調用遞歸查詢多次,每個參數值一次是最差的,你可以做。相反,您應該將遞歸查詢與提供參數值的遞歸查詢結合起來,並遍歷其「產品」。通常將遞歸查詢暫時打包到視圖中並將其與查詢的其他部分結合起來很方便。優化器將保重。

CREATE VIEW temp_view AS (
    with recursive temp(id, s, r, e) as (
    SELECT * 
    from rel 
    WHERE {recursive_condition} 
    -- Omit the restriction 
    -- AND rel_to_id = <parameter from sql query> 
    union /* all? */ 
    select * 
    from temp P 
    inner join relationship C on P.r = C.s 
    WHERE {recursion_stopper} 
    ) SELECT * FROM temp_view 
); 

-- Now join the recursive part 
-- with the one that supplies the restrictions 
SELECT ... 
FROM temp_view tv 
    , other_table ot 
WHERE tv.parameter = ot.parameter 
AND ... -- more stuff 
; 
+0

謝謝你的回答,我試過這個,但是這個查詢的結果是錯誤的,輸出包含重複的列==> temp_view有列a,b, c和other_table有相同的,但輸出是這樣的:a,b,c,a,b,c – user944308