【发布时间】:2017-02-14 10:35:34
【问题描述】:
这个问题与这个问题的优秀答案有关:Teradata REGEXP_SPLIT_TO_TABLE Input Parameter。下面是我可以创建的最简单的示例。
我有一个带有两个 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 不存在。”
【问题讨论】:
-
Teradata 中的多个 CTE 是一个巨大的痛苦。您必须以相反的顺序定义它们。我倾向于只使用 volatile 表。
-
感谢@Andrew,我经常使用多个 CTE,并且已经习惯了逆序约束。这里的问题与包含
STRTOK_SPLIT_TO_TABLE函数的CTE 的多个连接有关。关于 volatile 表,我的同事告诉我他们不在 Crystal Reports/BOXI 中工作,这是我们用来发布的前端。
标签: teradata common-table-expression