2014-02-10 53 views
2

我在這裏看過一些遞歸查詢,但沒有找到我的問題。除此之外,我是PostgreSQL的新手。postgreSQL中的遞歸查詢?

我有一個示例數據如下表:

number numberto ab st kz pv 
112  200     
140  210     
200  210     
210  220   f2 140 H 2011 
220     f2 140 H 2011  

查詢將是一個比較複雜一點,但是這是我解決不了的部分。 numberto指的是另一個number然後可能再次。我可以說這個鏈條會持續四五次。

有一天,其他四個coloumns然後是NOT NULL和充滿字母和/或數字。如果ab有內容,那麼其他三個也會有。如果最後一個彩色色塊被填滿,numberto可以進一步提及,但將保持不變,所以它能夠在那裏停止。

我的問題:我需要做一個數字的遞歸查詢,然後根據需要搜索numberto多少次,直到例如然後填充ab並獲得它們的輸出。

我該如何做到這一點?


SELECT version(); 

在x86_64未知-Linux的GNU的PostgreSQL 9.2.6,與gcc編譯(SUSE Linux)的4.3.4 [GCC-4_3-分支修訂152973],64位

+1

請顯示一個有用的數據示例,至少足以顯示一個完整的案例(輸入和預期輸出)。請給你的PostgreSQL版本。 –

+0

我試圖添加示例數據並添加版本();輸出。請告訴我,如果我能改善這個答案。 :) – Trollwut

+1

好吧,所以你想要走上numberto - >數字鏈,直到找到非空數據列。正確? –

回答

2

這是一個非常簡單的遞歸查詢,當您在遞歸術語中看到一個非空行時,您就會停止。

鑑於the following sample table

WITH RECURSIVE chain AS 
(
    -- Start with the row with number=140 
    SELECT number, numberto, ab, st, kz, pv 
    FROM numbers n 
    WHERE n.number = 140 
    UNION ALL 
    -- and iteratively fetch the 'numberto' id'd row 
    SELECT n.number, n.numberto, n.ab, n.st, n.kz, n.pv 
    FROM chain c 
    INNER JOIN numbers n ON (c.numberto = n.number) 
    -- unless we've already found a non-null col in our last iteration 
    WHERE c.ab IS NULL 
) 
-- Find any non-null result. 
SELECT * 
FROM chain c 
WHERE c.ab IS NOT NULL; 

應該做的伎倆,其中n.number = 140是你的啓動條件。

如果您發現非空col,或者如果您有一個NULL numberto或不匹配的numberto(因爲內部聯接將不添加行),則迭代停止。

+0

我現在試了幾個小時......你確定你可以在第二個SELECT中引用「n」嗎?因爲我的SQL程序只接受「c」。那裏作爲參考... – Trollwut

+0

@Trollwut絕對確定;遵循SQLFiddle鏈接,該鏈接演示了它按照書面形式運行。在這裏重複:http://sqlfiddle.com/#!15/41a9e/3 –

+0

Yessir,也適用於我的postgreSQL版本。但是我遇到了一個問題,其中一行實際上是LEFT JOINed ...然後我沒有得到它的工作。儘管如此,你的回答是對的 - 明天我會爲此工作。 – Trollwut