使用 SQL (Teradata) 为树创建物化路径
Creating a Materialized Path for a tree with SQL (Teradata)
我在 table 中给出了一个组织树,它被排序为 "top-down"(从 parent 到 child)。每个实例的级别也作为属性给出。
数据结构示例:
Index
Employee_name
Employee_level
1
Michael
1
2
Pam
2
3
Jim
2
4
Dwight
3
5
Angela
1
在上面的树中,Michael 是 Pam 和 Jim 的 parent,而 Jim 是 Dwight 的 parent。 Angela 与没有 children 的 Michael 平行。
我希望创建一个列,允许查询选定分支中的所有员工。
经过一些研究,我认为物化路径可以工作。因此,我可能需要创建一个包含每个员工的 parent 的列,然后使用递归创建另一个包含所需键的列。
关于如何使用 Teradata 创建此列的任何想法 SQL?
谢谢
这会让你得到 parent:
select t.*,
(
select max(index)
from tab as t2
where t2.index < t.index
and t2.Employee_level < t.Employee_level
) as parent_idx
from tab as t
当你在 table 中实现它时,你可以做简单的递归:
WITH RECURSIVE cte AS
( -- traverse the hierarchy and built the path
SELECT idx, parent_idx, Employee_level, Employee_name
,Cast(Employee_name AS VARCHAR(500)) AS Path -- must be large enough for concatenating all levels
FROM mytab
WHERE Employee_level = 1
UNION ALL
SELECT t.idx, t.parent_idx, t.Employee_level, t.Employee_name
,cte.Path || ',' || Trim(t.Employee_name)
FROM cte JOIN mytab AS t
ON cte.idx = t.parent_idx
)
select * from cte
order by idx
;
我在 table 中给出了一个组织树,它被排序为 "top-down"(从 parent 到 child)。每个实例的级别也作为属性给出。
数据结构示例:
Index | Employee_name | Employee_level |
---|---|---|
1 | Michael | 1 |
2 | Pam | 2 |
3 | Jim | 2 |
4 | Dwight | 3 |
5 | Angela | 1 |
在上面的树中,Michael 是 Pam 和 Jim 的 parent,而 Jim 是 Dwight 的 parent。 Angela 与没有 children 的 Michael 平行。
我希望创建一个列,允许查询选定分支中的所有员工。
经过一些研究,我认为物化路径可以工作。因此,我可能需要创建一个包含每个员工的 parent 的列,然后使用递归创建另一个包含所需键的列。
关于如何使用 Teradata 创建此列的任何想法 SQL?
谢谢
这会让你得到 parent:
select t.*,
(
select max(index)
from tab as t2
where t2.index < t.index
and t2.Employee_level < t.Employee_level
) as parent_idx
from tab as t
当你在 table 中实现它时,你可以做简单的递归:
WITH RECURSIVE cte AS
( -- traverse the hierarchy and built the path
SELECT idx, parent_idx, Employee_level, Employee_name
,Cast(Employee_name AS VARCHAR(500)) AS Path -- must be large enough for concatenating all levels
FROM mytab
WHERE Employee_level = 1
UNION ALL
SELECT t.idx, t.parent_idx, t.Employee_level, t.Employee_name
,cte.Path || ',' || Trim(t.Employee_name)
FROM cte JOIN mytab AS t
ON cte.idx = t.parent_idx
)
select * from cte
order by idx
;