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声明.
有关相关问题以了解正在发生的事情,请参阅此问题
好吧,这实际上比我想象的要难:
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。