Postgresql子查询获取多行

时间:2011-04-20 01:37:02

标签: postgresql

我有一个包含2列的表(table2):name和age。 我有另一个表(table1),其中包含列名,年龄,值,类型。

我想更新table1,添加table2值,value = 1,type =“abc”。

我试过了:

方法1:

insert into table1(select * from table2), 1, 'abc';

但是在1之前得到错误','说子查询不能返回多个列。

方法2:

CREATE TABLE table2
(
   name varchar(20),
   age varchar(20)
);

insert into table2 .... inserted some values

alter table table2 add "value" varchar(10);
alter table table2 add "name" varchar(20);

update table2 set value=1, name='abc';
insert into table1 select * from table2;

我正在使用PostgreSQL。任何人都可以帮我解决问题。方法2有效,但我认为这不是有效的方式。

2 个答案:

答案 0 :(得分:1)

INSERT INTO table1
SELECT table2.*, 1, 'abc'
FROM table2;

*表示法是引用表的所有列的快捷方式,但如果愿意,您仍可以添加更多列,例如常量。

答案 1 :(得分:0)

对于方法1: 由于子查询为单个插入返回多个值,因此会显示错误。

方法2:

此方法有效,因为您创建表2与表1相同,然后将表2中的所有值插入Table1。如果你这样做,为什么你必须维护两个单独的表来保存相同的数据?

您可以使用光标来解决此问题。

CREATE PROCEDURE USER_DATA_CURSOR
AS
DECLARE MY_CURSOR 
FOR
Select name,age From table2

Open My_Cursor

DECLARE @name varchar(20), @age varchar(20)

Fetch NEXT FROM MY_Cursor INTO @name, @age
While (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)

insert into table1(name,age,type,value) values(@name,@age,'abc',1);


FETCH NEXT FROM MY_CURSOR INTO @name, @age 
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
GO

Exec USER_DATA_CURSOR

代码不是Postgresql特有的,你可能需要相应调整它。如果您还有其他问题,请与我们联系