Postgresql pl sql查询递归循环

Postgresql pl sql查询递归循环,postgresql,Postgresql,我只有一张表格“tbl_测试” 下表列出了哪些文件 tbl_test table trx_id | proj_num | parent_num| 1 | 14 | 0 | 2 | 14 | 1 | 3 | 14 | 2 | 4 | 14 | 0 | 5 | 14 | 3 | 6 | 15

我只有一张表格“tbl_测试”

下表列出了哪些文件

tbl_test table
trx_id | proj_num  | parent_num|
1      | 14        | 0         |
2      | 14        | 1         |
3      | 14        | 2         |
4      | 14        | 0         |
5      | 14        | 3         |
6      | 15        | 0         |
我想要的结果是:获取trx_id值5时

这是一种亲子关系。所以

trx_id -> parent_num
5      -> 3
3      -> 2
2      -> 1
这意味着产值:

3
2
1
获取所有父链

我使用的查询:

SELECT *  FROM ( 
    WITH RECURSIVE tree_data(project_num, task_num, parent_task_num) AS( 
    SELECT project_num, task_num, parent_task_num 
          FROM tb_task 
          WHERE project_num = 14 and task_num = 5
             UNION ALL 
             SELECT child.project_num, child.task_num, child.parent_task_num
              FROM tree_data parent Join tb_task child 
               ON parent.task_num = child.task_num AND parent.task_num = child.parent_task_num 
             ) 
          SELECT project_num, task_num, parent_task_num 
           FROM tree_data 
              ) AS tree_list ;

有人能帮我吗?

没有必要用pl/pgsql来做这件事。您可以直接在SQL中完成。考虑:

WITH RECURSIVE my_tree AS (
     SELECT trx_id as id, parent_id as parent, trx_id::text as path, 1 as level
       FROM tbl_test
      WHERE trx_id = 5 -- start value
  UNION ALL
     SELECT t.trx_id, t.parent_id, p.path || ',' || t.trx_id::text, p.level + 1
       FROM my_tree p
       JOIN tbl_text t ON t.trx_id = p.parent
)
select * from my_tree;

如果您使用的是PostgresSQL,请尝试使用:


看看递归CTE(
带有递归查询)。检查了,但令人困惑…Mysql不支持,所以最好试试这个,@face.peck这被标记为postgresql。您从何处获取mysql?此查询将继续运行。不停止并抛出输出是否可能存在分层循环?如果您想查看它返回的内容,请添加到my_树中的第二个选择中,
其中级别<5
,并且它将只返回前4个迭代。在这种情况下,这对调试非常有用。此外,请注意,如果您需要循环(即,这是一个图形而不是一个树),您必须做一些额外的事情来过滤它们,
WITH regional_sales AS (    
        SELECT region, SUM(amount) AS total_sales
         FROM orders
         GROUP BY region
         ), top_regions AS (
         SELECT region
        FROM regional_sales
        WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales)
        )
SELECT region,
       product,
       SUM(quantity) AS product_units,
       SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;