2012-10-30 73 views
1

时,我有创建使用创建表一个表,并与这些列:多行错误填充表

create table myschema.mytable(
    id serial PRIMARY KEY, 
    row_num integer, 
    col_num integer, 
    pix_centroid geometry, 
    pix_val double precision 
) 

当我试图填充它:

insert into pixelbased (id, row_num, col_num, pix_centroid, pix_val) 
values (
    DEFAULT, 
    (select((ST_PixelAsPolygons(rast, 1)).x) from mytable where rid=3), 
    (select((ST_PixelAsPolygons(rast, 1)).x) from mytable where rid=3), 
    (select(ST_Centroid((ST_PixelAsPolygons(rast, 1)).geom)) from rwanda8 where rid=3), 
    (select(ST_PixelAsPolygons(rast, 1)).val from mytable where rid=3) 
) 

我遇到以下错误:

错误:由用作表达式的子查询返回多于一行的行。

我知道,因为我有不止一行的每列,这是有道理的有这样的错误。但我真的需要按照提及的方式计算所有列。任何人都知道我该怎么办? 其实我想结果插入表中以下查询:

select 
    (ST_PixelAsPolygons(rast, 1)).val as geomval1, 
    (ST_PixelAsPolygons(rast, 1)).x as X, 
    (ST_PixelAsPolygons(rast, 1)).y as Y, 
    (ST_Centroid((ST_PixelAsPolygons(rast, 1)).geom)) as geom 
from rwanda8 
where rid=3 

任何人都知道我应该怎么办?

回答

2

只需使用select查询中,而不是values

insert into pixelbased (row_num, col_num, pix_centroid, pix_val) 
select 
    (ST_PixelAsPolygons(rast, 1)).val as geomval1, 
    (ST_PixelAsPolygons(rast, 1)).x as X, 
    (ST_PixelAsPolygons(rast, 1)).y as Y, 
    (ST_Centroid((ST_PixelAsPolygons(rast, 1)).geom)) as geom 
from rwanda8 where rid=3 

不要插入ID,因为它是一个串行和将产生本身。

+0

谢谢你Clodoaldo。它为我工作。如果我想推广查询以包含所有的rid值,应该怎么做?我想为每个具有不同名称的rid分别设置'(ST_PixelAsPolygons(rast,1)).val as geomval1'。列数超过1000个,我无法手动完成。 –

+1

@ f.ashouri如果你有超过1000列,那么你做错了。创建另一个问题并解释你的数据,要求它正常化。 –

+0

对不起,我有1000多个ROWS,每个人都有特定的摆脱。我认为现在很清楚。我想为每个摆脱单独的_geomval_列。 –

2

其中一个子查询返回多于1行。因此,使用LIMIT 0,1或其他东西来获得每个子查询只有一个值。

如果您需要每列超过1个值,则应该检查插入算法并使用游标作为实例。

+0

实际上我的所有列都返回多行。我想要在表中查询结果(我刚刚编辑并在问题中添加了查询)。你能帮助我吗? –