2013-08-29 76 views
3

我試圖在現有表中創建一個新列,並使用select語句進行劃分以創建我想要插入到新列中的數據。我寫出的幾個陳述將作爲單獨的查詢工作,但我無法將這些陳述串成一個查詢。將列添加到表中並立即將數據添加到PostgreSQL中的列中

我仍在學習SQL,並將它與mySQL和PostgreSQL結合使用。我上個月在SQL上學了一門課,現在我正在嘗試自己的項目來保持我的技能。

我正在與MN的2012年選舉結果做一些工作,以便在我的表格中使用,以瞭解我正在使用的數據。

我已經能夠改變我的表格,並添加一個新的列與自己使用它們的這些語句。

ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2) 
ALTER TABLE mn2012ct_geom2 ADD COLUMN romney_pct decimal(10,2) 

我能夠使用此選擇語句產生我想要在我的終端應用程序中的信息。我在這裏要做的是從候選人獲得投票總票數中創建一個十進制數。

SELECT CAST (obama AS DECIMAL)/CAST (uspres_total AS DECIMAL) 
AS obama_pct FROM mn2012ct_geom2 

SELECT CAST (romney AS DECIMAL)/CAST (uspres_total AS DECIMAL) 
AS obama_pct FROM mn2012ct_geom2 

現在我想有這樣的信息添加到我創建或者用ALTER TABLE語句像我有高於或與INSERT語句,如果我創建這個查詢之前,該列的新列。

我曾嘗試合併查詢是這樣的:

ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2) AS 
(SELECT CAST (obama AS DECIMAL (10,2))/CAST (uspres_total AS DECIMAL (10,2)) 
AS obama_pct FROM mn2012ct_geom2); 

或使用Insert命令喜歡這一行,而不是ALTER TABLE語句

INSERT INTO mn2012ct_geom2 (romney_pct) AS 
(SELECT CAST (romney AS DECIMAL (10,2))/CAST (uspres_total AS DECIMAL (10,2)) 
AS romney_pct FROM mn2012ct_geom2); 

當我嘗試這樣做,它踢出來一個這樣的錯誤:

ERROR: syntax error at or near "AS" 
LINE 1: ...mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2) AS (SELECT... 

我以爲那種改變表和添加列或插入將工作,因爲該類型的格式工作時,我使用相同的選擇語句創建一個新的表。

CREATE TABLE obama_pct AS (SELECT CAST (obama AS DECIMAL (10,2))/CAST (uspres_total  
AS DECIMAL (10,2)) AS obama_pct FROM mn2012ct_geom2); 

任何幫助你可以提供我將不勝感激。我一直試圖谷歌和搜索這裏在stackoverflow找到答案,但我沒有發現什麼似乎完全符合我所做的似乎。

回答

5

一般來說它不是計算的數據添加到一個表是一個好主意。重新標準化表格時,有時需要這樣做,但通常不會完成。

正如Gordon所說,這裏要做的適當的事情是create a view。見the tutorial

沒有ALTER TABLE ... ADD COLUMN ... AS。您不能只是編寫語法,您需要查看documentation for the command you're interested in以瞭解如何使用它。 psql中的\h命令也是有用的,例如\h alter table

如果你確實需要的基礎上,從其他列運算的新列的設定值,在創建列使用後ALTER TABLE ... ADD COLUMN ... DEFAULT ...然後DROPDEFAULT項。通常創建列空白並可以爲空,然後用UPDATE聲明填充它。

E.g.未經測試的例子:

BEGIN; 

ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2); 

UPDATE mn2012ct_geom2 SET romney_pct = CAST (romney AS DECIMAL (10,2))/CAST (uspres_total AS DECIMAL (10,2); 

COMMIT; 

,或者有些醜陋:

BEGIN; 

ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2) NOT NULL DEFAULT (CAST (obama AS DECIMAL (10,2))/CAST (uspres_total AS DECIMAL (10,2)); 

ALTER TABLE mn2012ct_geom2 ALTER COLUMN obama_pct DROP DEFAULT; 

COMMIT; 
+0

謝謝你的建議,並幫助我學習。將仔細看看視圖並瞭解它們的工作原理。 –

3

我認爲您在尋找update聲明。例如:

ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2); 

update mn2012ct_geom2 
    set obama_pct = CAST(obama AS DECIMAL)/CAST(uspres_total AS DECIMAL); 

您也可以考慮只創建一個視圖做計算:

create view v_mn2012ct_geom2 as 
    select g.*, CAST(obama AS DECIMAL)/CAST(uspres_total AS DECIMAL) as mn2012ct_geom2 
    from mn2012ct_geom2; 
+0

感謝您的幫助和欣賞的評論。在看過克雷格之後,我看到你忽略了這個部分,爲什麼我一開始就無法得到你的答案。 –