创建一个在Teradata中具有"with recursive"语句的递归视图

Jas*_*lns 7 sql recursion view recursive-query teradata

我想CREATE RECURSIVE VIEW从以下可重现的示例中在Teradata中创建一个递归视图(即):

CREATE VOLATILE TABLE vt1
(
    foo VARCHAR(10)
    , counter INTEGER
    , bar INTEGER
)
ON COMMIT PRESERVE ROWS;

INSERT INTO vt1 VALUES ('a', 1, '1');
INSERT INTO vt1 VALUES ('a', 2, '2');
INSERT INTO vt1 VALUES ('a', 3, '2');
INSERT INTO vt1 VALUES ('a', 4, '4');
INSERT INTO vt1 VALUES ('a', 5, '1');
INSERT INTO vt1 VALUES ('b', 1, '3');
INSERT INTO vt1 VALUES ('b', 2, '1');
INSERT INTO vt1 VALUES ('b', 3, '1');
INSERT INTO vt1 VALUES ('b', 4, '2');

WITH RECURSIVE cte (foo, counter, bar, rsum) AS
(
SELECT
    foo
  , counter
  , bar
  , bar AS rsum
FROM 
    vt1
QUALIFY ROW_NUMBER() OVER (PARTITION BY foo ORDER BY counter) = 1

UNION ALL

SELECT
    t.foo
  , t.counter
  , t.bar
  , CASE WHEN cte.rsum < 3 THEN t.bar + cte.rsum ELSE t.bar END
FROM
    vt1 t JOIN cte ON t.foo = cte.foo AND t.counter = cte.counter + 1
)

SELECT 
    cte.*
  , CASE WHEN rsum < 5 THEN 0 ELSE 1 END AS tester
FROM 
    cte
ORDER BY 
    foo
    , counter
;
Run Code Online (Sandbox Code Playgroud)

这会创建此输出:

???????????????????????????????????????
? foo ? counter ? bar ? rsum ? tester ?
???????????????????????????????????????
? a   ?       1 ?   1 ?    1 ?      0 ?
? a   ?       2 ?   2 ?    3 ?      0 ?
? a   ?       3 ?   2 ?    5 ?      1 ?
? a   ?       4 ?   4 ?    4 ?      0 ?
? a   ?       5 ?   1 ?    5 ?      1 ?
? b   ?       1 ?   3 ?    3 ?      0 ?
? b   ?       2 ?   1 ?    4 ?      0 ?
? b   ?       3 ?   1 ?    5 ?      1 ?
? b   ?       4 ?   2 ?    2 ?      0 ?
???????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

我最终希望"保存"作为一种观点.我尝试CREATE RECURSIVE VIEW了几种变体,但我认为我不理解如何绕过WITH RECURSIVE cte声明.

有关相关问题以了解正在发生的事情,请参阅此问题

And*_*rew 3

好吧,这实际上比我想象的要难:

create recursive view db.test_view (
foo, counter,bar,rsum) as 
(SELECT
    foo,
    counter,
    bar,
    bar AS rsum
    FROM 
    vt1
    QUALIFY ROW_NUMBER() OVER (PARTITION BY foo ORDER BY counter) = 1

UNION ALL
SELECT
    t.foo,
    t.counter,
    t.bar,
    CASE WHEN cte.rsum < 5 THEN
        t.bar + cte.rsum
    ELSE t.bar 
    END
FROM
vt1 t
JOIN test_view cte
ON t.foo = cte.foo
AND t.counter = cte.counter + 1

)
Run Code Online (Sandbox Code Playgroud)

不要限定视图的递归连接。即,,JOIN test_view不是JOIN db.test_view