我正在使用下面的递归函数,它将循环超过4500次。在每次迭代中,代码将提取超过50条记录。
WITH RECURSIVE RECEMP (
EMP_ID,
EMP_DB,
lvl,
LEVEL
)
AS (
SELECT EMP_ID,
EMP_DB,
lvl,
1 (INT)
FROM EDW_MAN_WORK.emp --WHERE EMP_ID = 12
UNION ALL
SELECT E.EMP_ID,
E.EMP_DB,
E.lvl,
R.LEVEL + 1
FROM EDW_MAN_WORK.emp E
INNER JOIN RECEMP R
ON E.EMP_ID = R.EMP_ID
AND R.LEVEL <= r.lvl
)
SELECT EMP_ID,
EMP_DB,
Lvl,
LEVEL
FROM RECEMP
由于SPOOL空间错误,我的查询失败。我们可以在递归表上收集统计数据吗?
我也尝试过使用存储过程,但这又非常耗时。
请提出另一种方法。
答案 0 :(得分:0)
不 - 您无法在Teradata的CTE上收集统计数据。
看来你在CTE和EMP
表之间的连接可能会引入一个无限循环。我并不完全理解你想要建立的关系,但在我看来,表面上你在CTE和EMP
之间的联系应该是E.EMP_DB = R.EMP_ID
。我再次在这里做出一个很大的假设,即您尝试使用递归映射的关系介于EMP_DB
和EMP_ID
之间。
尽管如此,我建议您限制递归的深度作为保障。这可以帮助您运行查询并在查询耗尽假脱机空间之前获得一些结果。见下文:
WITH RECURSIVE RECEMP (
EMP_ID,
EMP_DB,
lvl,
LEVEL
)
AS (
SELECT EMP_ID,
EMP_DB,
lvl,
1 (INT)
FROM EDW_MAN_WORK.emp --WHERE EMP_ID = 12
UNION ALL
SELECT E.EMP_ID,
E.EMP_DB,
E.lvl,
R.LEVEL + 1
FROM EDW_MAN_WORK.emp E
INNER JOIN RECEMP R
ON E.EMP_ID = R.EMP_ID
AND R.LEVEL <= r.lvl
/* Depth Control - You expect a depth <= 50 */
AND R.LEVEL = 60
)
SELECT EMP_ID,
EMP_DB,
Lvl,
LEVEL
FROM RECEMP