테라

2016-12-02 3 views
7

의 문 "반복적으로"나는 테라 데이타의 재귀보기를 만들 싶습니다 (즉, 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 ║ 
╚═════╩═════════╩═════╩══════╩════════╝ 

나는 궁극적으로보기로 "저장"하고 싶습니다. 내가 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. 왜 처음에는 휘발성 테이블을 사용하고 있습니까?