2016-12-02 75 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.爲什麼你首先使用易失性表格?