迭代SQL查询

时间:2018-12-15 07:09:43

标签: sql hana

我对二叉树有一个棘手的要求

这就是我的数据的样子

ID     IDNEXT
1A       2E
3D       4A
2E       6F
6F       3D
4A       

我的输出应该在此fashin中

ID     IDNEXT
1A      2E
2E      6F
6F      3D
3D      4A
4A 

根据当前的IDNEXT,我应该为mynext ID,我们应该继续这样,直到结尾和深度未知为止

任何建议

预先感谢

2 个答案:

答案 0 :(得分:0)

我不熟悉Hana,但是在标准SQL中,您可以使用递归CTE(公用表表达式)。

以下示例已在PostgreSQL上进行了测试:

CREATE TABLE links(id VARCHAR(10), idnext VARCHAR(10));

INSERT INTO links(id, idnext) values('1a','2e'), ('3d','4a'), ('2e','6f'), ('6f', '3d');

WITH RECURSIVE cte AS (
  SELECT id, idnext FROM links WHERE id='1a'   -- the first node  
  UNION ALL    
  SELECT links.id, links.idnext 
    FROM links  
    JOIN cte 
    ON  links.id = cte.idnext
) 
SELECT * FROM cte;

结果:

 id | idnext 
----+--------
 1a | 2e
 2e | 6f
 6f | 3d
 3d | 4a

答案 1 :(得分:0)

正如我的评论中所述,SAP HANA提供了Hierarchy-Functions,可以非常有效地处理通过“节点” /“父节点”方案在表中编码的层次结构数据。

此问题的要求可以表示为“先深度遍历有向图,然后按访问顺序返回被访问的节点”。

具有易于执行的层次结构功能:

create column table con (ID nvarchar(2) not null
                       , IDNEXT nvarchar(2) not null);
/*
ID     IDNEXT
1A       2E
3D       4A
2E       6F
6F       3D
4A
*/

insert into con values ('1A', '2E');
insert into con values ('3D', '4A');
insert into con values ('2E', '6F');
insert into con values ('6F', '3D');
insert into con values ('4A', '');

SELECT   
     hierarchy_rank AS rank,
     node_id,
     parent_id
FROM HIERARCHY (
    SOURCE (SELECT  ID  as "NODE_ID"
                  , IDNEXT as "PARENT_ID" 
            FROM con)
    START WHERE IDNEXT =''
    )
ORDER BY
    hierarchy_rank desc;

/*
RANK    NODE_ID PARENT_ID
5       1A      2E       
4       2E      6F       
3       6F      3D       
2       3D      4A       
1       4A               
*/

这种方法得益于

  • 基于表数据如何创建层次结构以及应该对层次结构进行哪些计算的表现力
  • SAP HANA中层次结构处理的高效(时空)实现,而不是通过SQL函数来模拟功能。当结构被自动缓存时应重用相同的层次结构时,这特别方便。

具有这些特殊功能的最大障碍可能是,它们需要仔细考虑要定义的层次结构/图形。幸运的是, SAP HANA学院提供了一些教程videos