【问题标题】:Teradata - Two Joins to a CTE StrTok_Split_To_Table function - Error 3807Teradata - CTE StrTok_Split_To_Table 函数的两个连接 - 错误 3807
【发布时间】: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


【解决方案1】:

虽然这可能但不一定回答您的问题,但这里确实不需要您的第二个 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

【讨论】:

  • 这是我第一次尝试找出如何从函数中获取参数时的起点:stackoverflow.com/q/39709105/293078。有趣的是,我从那以后就忘记了这是一种选择。它击败了我想出的唯一另一件事,即每组 CTE 加倍(三倍......)。绝对值得一票!
  • 另一种选择是不使用 CTE,而是将 Split_Params 作为子查询粘贴在您的主查询中,只是多次,因为 CTE 在这里不适合您。
  • 实际上,您上面的答案很好。它没有解决的唯一问题只是美学问题,希望我的所有参数(还有其他参数)都在一个 CTE 中。我会继续接受它。再次感谢。
猜你喜欢
  • 2020-10-29
  • 2014-04-08
  • 2017-08-20
  • 2016-12-21
  • 1970-01-01
  • 2021-11-22
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多