我正在尝试在现有表中创建一个新列,并使用select语句进行除法以创建我想要插入到我的新列中的数据。我写的几个语句将作为单独的查询工作,但我无法将语句串在一起形成一个查询。
我仍在学习SQL并将其与mySQL和PostgreSQL一起使用。我上个月上了一堂关于SQL的课,现在我正在尝试自己的项目来保持我的技能。
我正在做一些有关2012年在MN的选举结果的工作,以便在我的表格中使用,以了解我正在使用的数据。
我已经能够改变我的表并使用它们自己添加一个包含这些语句的新列。
ALTER TABLE mn2012ct_geom2 ADD COLUMN obama_pct decimal(10,2)
ALTER TABLE mn2012ct_geom2 ADD COLUMN romney_pct decimal(10,2)
我能够使用这个select语句在我的终端应用程序中生成我想要的信息。我在这里要做的是从候选人投票的总票数中创建一个十进制数。
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表语句一样,或者如果我在此查询之前创建列,则使用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...
我认为那种Alter表和添加列或插入都可以工作,因为当我使用相同的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);
任何帮助都可以提供我非常感谢。我一直在尝试google并在stackoverflow上搜索,以找到答案,但我找到的所有内容似乎都不适合我正在做的事情。
答案 0 :(得分:7)
通常,将计算数据添加到表中并不是一个好主意。在重新规范表时,有时需要这样做,但通常情况下还没有完成。
正如戈登所说,这里适当的做法是create a view。请参阅the tutorial。
没有ALTER TABLE ... ADD COLUMN ... AS
。您不仅可以编写语法,还需要查看documentation for the command you're interested in以了解如何使用它。 \h
中的psql
命令也很有用,例如\h alter table
。
如果您确实需要根据其他列的计算在新列中设置值,请在创建列后使用ALTER TABLE ... ADD COLUMN ... DEFAULT ...
然后DROP
DEFAULT
项。通常最好将列空白并为空,然后用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;
答案 1 :(得分: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;