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
这个问题与这个问题的优秀答案有关:
我有一个带有两个 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