2016-01-22 47 views
1

我sqlfiddle:http://sqlfiddle.com/#!15/4f9da/1如何更新一組行

我真的不好解釋這個和小白做複雜的查詢(只是基礎知識),因爲它的複雜。

情況:列修訂是一組同一個對象的關係,例如:IDS 1 2 3是相同的對象,總是闖民宅使用idground_id最後的老物件。

問題:我需要ord列,使同一ID同一組的對象。例如:在IDS 1 2 3需要自己的價值來設置好的1,因爲修改過程0是id 1。 id爲4,它必須有ord 4和id 5

基本上必須是這樣的:

enter image description here

回答

1

你需要一個recursive query做到這一點。首先您選擇行ground_id IS NULL,將ord設置爲值id。在以下迭代中,根據ground_id的值添加更多行,將ord的值設置爲與其匹配的行的值。然後,您可以使用該行集(id, ord)的作爲UPDATE行來源:

WITH RECURSIVE set_ord (id, ord) AS (
    SELECT id, id 
    FROM ground 
    WHERE ground_id IS NULL 
    UNION 
    SELECT g.id, o.ord 
    FROM ground g 
    JOIN set_ord o ON o.id = g.ground_id 
) 
UPDATE ground g 
    SET ord = s.ord 
    FROM set_ord s 
    WHERE g.id = s.id; 

(SQLFiddle目前沒有響應,所以我不能發佈我的代碼中有)

+0

你知道它的變化來自postgres 8?在9工作正常,但在8給我錯誤的語法更新。我看到文檔和theres沒有區別。 – fsi

+0

帶有'UPDATE'的遞歸查詢只能從版本9.1開始使用。但你真的不應該再使用這樣一箇舊版本了; 8.4在2014年7月支持結束。[8.4文檔](http://www.postgresql.org/docs/8.4/static/sql-update.html)不會顯示帶遞歸查詢的選項。 – Patrick

+0

我知道,在我的開發中它是9.4,但是當我檢查產量時,它是8.14.4。正在遷移它。 – fsi