8

我正在尝试在现有表中创建一个新列,并使用 select 语句进行除法以创建要插入到新列中的数据。我写出的几个语句将作为单独的查询工作,但我无法将这些语句串在一起成为一个查询。

我仍在学习 SQL 并将其与 mySQL 和 PostgreSQL 一起使用。上个月我参加了 SQL 的课程,现在我正在尝试做自己的项目以保持我的技能敏锐。

我正在对 2012 年明尼苏达州的选举结果进行一些工作,以在我的表格中使用,以了解我正在使用的数据。

我已经能够更改我的表并添加一个新列,其中包含这些语句自己使用它们。

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 table 语句创建的新列中,或者如果我在此查询之前创建列,则使用插入语句。

我试过这样的组合查询:

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);   

可以为您提供任何帮助,我将不胜感激。我一直在尝试谷歌并在 stackoverflow 上搜索以找到答案,但我发现的所有内容似乎都不完全符合我正在做的事情。

4

2 回答 2

10

通常,将计算数据添加到表中并不是一个好主意。重新规范化表时有时需要这样做,但通常不会这样做。

正如 Gordon 所说,在这里要做的适当的事情是创建一个视图。请参阅教程

没有ALTER TABLE ... ADD COLUMN ... AS。您不能只编写语法,您需要查看您感兴趣的命令的文档以了解如何使用它。\hin 命令psql也很有用,例如\h alter table.

如果您确实需要根据其他列的计算在新列中设置值,请在创建列后使用ALTER TABLE ... ADD COLUMN ... DEFAULT ...DROP术语DEFAULT。通常最好将列创建为空白且可为空,然后用UPDATE语句填充它。

例如未经测试的例子:

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;
于 2013-08-29T02:32:07.170 回答
4

我想你正在寻找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;
于 2013-08-29T00:56:29.327 回答