2017-06-05 6 views
0

私は(id、name、parent_id)列を持つテーブルフォルダを持っています。親のフォルダはparent_id = -1です。私は各フォルダの最上位親IDを取得する必要があります。次のクエリは正常に動作しますが、バネデータjpaでは動作しません。PostgreSQL関数で再帰的クエリを使用する

WITH RECURSIVE nodes_cte AS (
SELECT tn.id, tn.parent_id, tn.name, tn.id top_id 
FROM folder AS tn 
WHERE tn.parent_id =-1 
UNION ALL 
SELECT c.id, c.parent_id, c.name, p.top_id 
FROM nodes_cte AS p, folder AS c 
WHERE c.parent_id = p.id 
) 
SELECT distinct * FROM nodes_cte 

上記のクエリと同じ結果を返すpostgresql関数を作成するにはどうすればよいですか?

答えて

1

は、テーブルを返すSQL関数を作成します。

CREATE OR REPLACE FUNCTION my_function() 
RETURNS TABLE (id int, parent_id int, name text, top_id int) 
LANGUAGE SQL AS $$ 
    WITH RECURSIVE nodes_cte AS (
    SELECT tn.id, tn.parent_id, tn.name, tn.id top_id 
    FROM folder AS tn 
    WHERE tn.parent_id =-1 
    UNION ALL 
    SELECT c.id, c.parent_id, c.name, p.top_id 
    FROM nodes_cte AS p, folder AS c 
    WHERE c.parent_id = p.id 
    ) 
    SELECT distinct * FROM nodes_cte 
$$; 

--use: 
SELECT * 
FROM my_function(); 

注意、返されたテーブル内のname列が表folderと同じタイプを持つ必要があります。

+0

ありがとう – Lusi

関連する問題