2016-12-02 1 views
7

で声明「再帰と」持っている再帰的なビューを作成します。私は以下の再現性の例からのTeradata(すなわち、<code>CREATE RECURSIVE VIEW</code>)で再帰的なビューを作成したいの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_viewJOIN db.test_viewではありません。

+0

ありがとうございます。私はそれが何か単純だと思っていました。もっと精巧な問題の文脈では、この例に戻って参考にしてください。 – JasonAizkalns

+0

は依然として苦労しています。ビューの作成後、私はアクセスできません。テーブル 'vt1'は存在しません。何かご意見は? – JasonAizkalns

+1

質問の揮発性テーブルを参照するビューを作成しようとしていますか?私はあなたがそれを行うことができるとは確信していません。 GLOBAL TEMPORARY TABLEまたは通常の表を使用できます。 –

0

揮発性テーブルは、ユーザーのスプールスペース割り当てに格納され、ユーザー名で修飾する必要があります。
P.s.なぜあなたは最初に揮発性テーブルを使用していますか?

関連する問題