【问题标题】:Postgresql subquery fetching multiple rowsPostgresql子查询获取多行
【发布时间】:2011-04-20 01:37:02
【问题描述】:

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

我想通过添加 table2 值和 value=1 和 type="abc" 来更新 table1。

我试过了:

方法一:

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

但是在 1 之前的 ',' 处出现错误,表示子查询不能返回多于一列。

方法二:

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 有效,但我猜这不是有效的方法。

【问题讨论】:

标签: postgresql


【解决方案1】:
INSERT INTO table1
SELECT table2.*, 1, 'abc'
FROM table2;

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

【讨论】:

  • 我在找这个。非常感谢。
【解决方案2】:

对于方法 1: 因为子查询为单个插入返回多个值,所以出现了错误。

方法二:

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

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

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,您可能需要相应地对其进行调整。如果您还有其他问题,请告诉我

【讨论】:

  • 实际上我的问题是我有一个表,并且对于特定值(第 4 列)必须添加一个类型(第 3 列)。所以表 2 是姓名和年龄的不同值。对于那些没有这种类型和价值的名字和年龄。我必须为名称和年龄的所有不同组合向表中添加新行。所以我提取了名称和年龄的不同值并尝试添加类型和值并再次添加到现有表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多