使用 plpgsql 进行递归查询

Cha*_*hau 2 postgresql plpgsql functions postgresql-9.2

我正在尝试编写一个plpgsql函数,该函数从树结构中的记录递归返回一组列。

我有一个数据表和一个将数据链接在一起的表:

DATATABLE
-----------
id integer
value text
info text

LINKTABLE
-----------
link integer
parent integer
Run Code Online (Sandbox Code Playgroud)

我的想法是在以下功能中做类似的事情:

CREATE OR REPLACE FUNCTION my_function(itemID integer)
  RETURNS TABLE(id integer, value text) AS
$BODY$
BEGIN    
    RETURN QUERY SELECT my_function(A.link) FROM linktable A, datatable B 
        WHERE A.parent = B.id AND B.id = itemID) C;

    RETURN QUERY SELECT id, value FROM datatable WHERE id = itemID;            
    RETURN;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我在第一个查询中遇到错误:

错误:查询结构与函数结果类型不匹配

我的Just-In-Brain编译器没有检测到任何问题,那么我在这里做错了什么?

a_h*_*ame 6

你根本不需要函数,这可以用一条 SQL 语句来完成:

with recursive tree as (id, parent) (
    select link as id, 
           parent
    from linktable
    where id = itemid

    union all

    select c.link as id,
           c.parent
    from linktable c
      join tree p on p.id = c.parent
) 
select dt.id, dt.value
from tree
  join datatable dt on dt.id = tree.id
Run Code Online (Sandbox Code Playgroud)

有关递归查询的介绍,请参阅手册:http : //www.postgresql.org/docs/current/static/queries-with.html