2013-12-20 77 views
0

原諒可能是一個愚蠢的問題,但我不是一個數據庫大師。postgres,在缺失值時添加行

我有一個三列的表。這裏有一個例子:

stationtest | id_date | val_no3 
------------+-------------+--------- 
27   | 1  |  
27   | 2  | 7   
27   | 25  | 
27   | 50  | 8 
27   | 75  | 9 
27   | 100  | 10 
30   | 1  |  
30   | 14  | 7   
30   | 25  | 
30   | 65  | 8 
30   | 75  | 9 
30   | 100  | 10 

我想有有一行每個值id_date缺少新的表和它結合stationtest數, 像這樣的:

stationtest | id_date | val_no3 
------------+-------------+--------- 
27   | 1  |  
27   | 2  | 7 
27   | 3  | 
27   | 4  | 
27   | 5  | 
27   | 6  | 
27   | (...) |  
27   | 25  | 
27   | 26  | 
27   | 27  | 
27   | (...) | 
27   | 50  | 8 
27   | (...) | 
27   | 75  | 9 
27   | (...) | 
27   | 98  | 
27   | 99  | 
27   | 100  | 10 
30   | 1  |  
30   | 2  | 7 
30   | 3  | 
30   | 4  | 
30   | 5  | 
30   | 6  | 
30   | (...) |  
30   | 25  | 
30   | 26  | 
30   | 27  | 
30   | (...) | 
30   | 50  | 8 
30   | 75  | 9 
30   | (...) | 
30   | 98  | 
30   | 99  | 
30   | 100  | 10 

我有這個查詢,但我不知道如何使它爲每個站測試工作:

insert into tabletest (id_date) 
select i 
from generate_series(1, (select max(id_date) from tabletest)) i 
    left join tabletest on tabletest.id_date = i 
where tabletest.id_date is null; 

這是可能的嗎? 謝謝你的幫助。

+0

A [SQLFiddle](http://sqlfiddle.com/)將不勝感激。 – jpmc26

回答

0

試試這個:

DO $$ 
DECLARE 
st_test integer; 
i integer; 
BEGIN 
    FOR st_test in (SELECT distinct stationtest FROM tabletest) LOOP 
    EXECUTE 'INSERT INTO test(stationtest, id_date) SELECT $1 as stationtest, generate_series as id_date FROM generate_series((SELECT min(id_date) FROM test), (SELECT max(id_date) FROM test))' USING st_test; 
    END LOOP; 
END; 
$$; 

我沒有數據方便,但一般格式應該工作。

+0

謝謝你的回答,它可能是好的,但它不起作用,因爲我需要爲每個工作站添加一個數字,當我在我的示例中添加一行時。 – Leasye

+0

嗯,我已經編輯它考慮到這一點。 –

+0

我試過了,但是我有一個錯誤: [錯誤] 1.0:語法錯誤,意外字符;你知道該怎麼辦? (我有postgres 9.3.1 btw) – Leasye