创建一个递归视图,其中包含带有递归的"" Teradata的声明

时间:2016-12-02 20:44:00

标签: sql recursion view teradata recursive-query

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

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
;

这会创建此输出:

╔═════╦═════════╦═════╦══════╦════════╗
║ 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 ║
╚═════╩═════════╩═════╩══════╩════════╝

我最终会喜欢&#34;保存&#34;作为一种观点。我尝试了CREATE RECURSIVE VIEW和几种变体,但我认为我不理解如何绕过WITH RECURSIVE cte声明。

要了解相关问题,请参阅this question

2 个答案:

答案 0 :(得分: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

)

不要将递归连接限定为视图。 IE,JOIN test_view,而非JOIN db.test_view

答案 1 :(得分:0)

易失性表格存储在用户的表格中。假脱机空间配额,应使用您的用户名限定 附:你为什么一开始使用volatile表?