Teradata - 两个连接到 CTE StrTok_Split_To_Table 函数 - 错误 3807

Teradata - Two Joins to a CTE StrTok_Split_To_Table function - Error 3807

这个问题与这个问题的优秀答案有关:。下面是我可以创建的最简单的示例。

我有一个带有两个 CTE(WITH 子句)的 TERADATA 查询。第一个 CTE 包含一个 STRTOK_SPLIT_TO_TABLE 函数,该函数引用从用户收集参数的第二个 CTE。查询的主体有一个 SELECT 语句,它引用第一个 CTE 并获取一列拆分参数。这很好用:

WITH 
    SPLIT_PARAMS(PARAM) AS
    (SELECT
        TEST_TABLE.SPLIT_PARAMS
    FROM
        TABLE (StrTok_Split_To_Table(1, PARAMS.INPUT_PARAMS, '|')
            RETURNS (outkey INTEGER, TOKENNUM INTEGER, SPLIT_PARAMS VARCHAR(8192) CHARACTER SET Unicode)) AS TEST_TABLE)
    ,

    PARAMS (INPUT_PARAMS) AS
    (SELECT
        '?InputParams' AS INPUT_PARAMS
    )

SELECT 
    SPLIT_PARAMS.PARAMS
FROM SPLIT_PARAMS

但是,我希望能够不止一次地参考 SPLIT_PARAMS CTE。当我这样做时,我得到一个 [3807] object 'PARAMS' does not exist 错误:

WITH 
    SPLIT_PARAMS(PARAM) AS
    (SELECT
        TEST_TABLE.SPLIT_PARAMS
    FROM
        TABLE (STRTOK_SPLIT_TO_TABLE(1, PARAMS.INPUT_PARAMS, '|')
            RETURNS (outkey INTEGER, TOKENNUM INTEGER, SPLIT_PARAMS VARCHAR(8192) CHARACTER SET UNICODE)) AS TEST_TABLE)
    ,

    PARAMS (INPUT_PARAMS) AS
    (SELECT
        '?InputParams' AS INPUT_PARAMS
    )

SELECT 
    SP1.PARAM,
    SP2.PARAM
FROM SPLIT_PARAMS SP1
    CROSS JOIN SPLIT_PARAMS SP2

我尝试了很多方法,比如在主查询中放置两个 SPLIT_PARAMS 子查询,并使用上一个问题的答案中提到的旧式 JOIN。但是,任何多次尝试加入 SPLIT_PARAMS CTE 都会产生此错误。 (我的实际设置是三个 CTE 深度,但结果是一样的 - "PARAMS does not exist."

虽然这可能但不一定能回答您的问题,但实际上不需要您的第二个 CTE:只需将输入参数推入 strtok_Split_to_table 函数即可让您点击 Split_Params cte不止一次:

WITH SPLIT_PARAMS(PARAM) AS
(
    SELECT
        TEST_TABLE.SPLIT_PARAMS
    FROM
        TABLE
        (
            StrTok_Split_To_Table(1, '?InputParams', '|')
            RETURNS (outkey INTEGER, TOKENNUM INTEGER, SPLIT_PARAMS VARCHAR(8192) CHARACTER SET Unicode)
        ) AS TEST_TABLE
)
SELECT 
    SP1.PARAM,
    SP2.PARAM
FROM SPLIT_PARAMS SP1
    CROSS JOIN SPLIT_PARAMS SP2