2013-03-14 100 views
0

我只有一个表 “tbl_test”PL SQL查询recuresive循环

其中有表提起低于

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 ; 

任何人可以帮助我吗?

+0

看看递归的CTE('WITH RECURSIVE'查询)。 – 2013-03-14 12:24:04

+0

检查但令人困惑... – 2013-03-14 12:28:57

+0

Mysql不支持WITH,所以最好试试这个, http://stackoverflow.com/questions/1382573/how-do-you-use-the-with-clause -in-mysql – Balamurugan 2013-03-14 12:29:16

回答

1

没有必要使用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; 
+0

此查询继续运行。不停止并抛出输出 – 2013-03-14 12:56:53

+0

是否有可能您有层次循环?如果你想看看它返回的是什么,请添加到my_tree中的第二个SELECT中,WHERE level <5',它只会返回前4次迭代。这在这种情况下可以用于调试。 – 2013-03-14 13:28:27

+0

还要注意,如果你期待*循环(即这是一个图而不是树),你必须做一些额外的事情来过滤它们, – 2013-03-14 13:33:35

0

如果你正在使用PostgreSQL的,请尝试使用WITH clause

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;