替代teradata中递归的存储过程

时间:2014-01-09 08:14:53

标签: sql teradata

我正在使用下面的递归函数,它将循环超过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空间错误,我的查询失败。我们可以在递归表上收集统计数据吗?

我也尝试过使用存储过程,但这又非常耗时。

请提出另一种方法。

1 个答案:

答案 0 :(得分:0)

不 - 您无法在Teradata的CTE上收集统计数据。

看来你在CTE和EMP表之间的连接可能会引入一个无限循环。我并不完全理解你想要建立的关系,但在我看来,表面上你在CTE和EMP之间的联系应该是E.EMP_DB = R.EMP_ID。我再次在这里做出一个很大的假设,即您尝试使用递归映射的关系介于EMP_DBEMP_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