2016-12-02 14 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

वाक्यविन्यास 'रिकर्सिव व्यू बनाएं ....'। यहां दस्तावेज़ों का एक लिंक दिया गया है: 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 

) 

पुनरावर्ती को देखने के लिए में शामिल होने के योग्य नहीं है। आईई, JOIN test_view, JOIN db.test_view नहीं।

+0

धन्यवाद। मैंने सोचा कि यह कुछ आसान था और एक और अधिक विस्तृत समस्या के संदर्भ में, इस उदाहरण को वापस देखना अच्छा लगा। – JasonAizkalns

+0

अभी भी संघर्ष कर रहा है - निर्माण के बाद, मैं पहुंचने में असमर्थ हूं। यह कहता है कि तालिका 'vt1' मौजूद नहीं है। कोई विचार? – JasonAizkalns

+1

क्या आप ऐसे दृश्य को बनाने का प्रयास कर रहे हैं जो आपके प्रश्न में अस्थिर तालिका का संदर्भ देता है? मुझे यकीन नहीं है कि आप ऐसा कर सकते हैं। आप एक वैश्विक टेम्पलेट टेबल या नियमित तालिका का उपयोग कर सकते हैं। –

0

अस्थिर तालिकाओं को उपयोगकर्ता के 'स्पूल स्पेस कोटा पर संग्रहीत किया जाता है और आपके उपयोगकर्ता नाम के साथ योग्यता प्राप्त की जानी चाहिए।
पी। आप पहले स्थान पर अस्थिर तालिकाओं का उपयोग क्यों कर रहे हैं?

संबंधित मुद्दे