2016-12-02 16 views
7

Я хотел бы создать рекурсивный вид в 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 
; 

Это создает этот выход:

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

Который в конечном итоге хотел бы «сохранить» как вид. Я пробовал CREATE RECURSIVE VIEW и несколько вариантов, но я думаю, что не понимаю, как обойти заявление WITH RECURSIVE cte.

Для связанный с этим вопрос, чтобы понять, что происходит, см this question

+0

Синтаксис 'create recursive view ....'. Вот ссылка на документацию: http://www.info.teradata.com/HTMLPubs/DB_TTU_13_10/index.html#page/SQL_Reference/B035_1144_109A/Create_Procedure-Syntax.06.77.html#ww10851072 – Andrew

ответ

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.

+0

Спасибо. Я полагал, что это было что-то простое, и в контексте гораздо более сложной проблемы приятно вернуться к этому примеру. – JasonAizkalns

+0

все еще борется - после создания представления я не могу получить доступ. Он говорит, что таблица 'vt1' не существует. Есть предположения? – JasonAizkalns

+1

Вы пытаетесь создать представление, которое ссылается на изменчивую таблицу в вашем вопросе? Я не уверен, что вы можете это сделать. Вы можете использовать GLOBAL TEMPORARY TABLE или обычную таблицу. –

0

летучие таблицы хранятся в квоте пространства спула пользователя и должны быть квалифицированы с вашим именем пользователя.
P.s. Почему вы используете волатильные таблицы в первую очередь?