2011-04-20 50 views
0

我有一個包含2列的表(table2):名稱和年齡。 我有另一個表(table1)與列名稱,年齡,價值,類型。Postgresql子查詢獲取多行

我想更新table1添加table2值和值= 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的作品,但這不是有效的方式,我猜。

+0

在提問之前在計算器中搜索答案。希望這個問題解決你的問題:http://stackoverflow.com/questions/3736732/update-or-insert-multiple-rows-and-cols-from-subquery-in-postgresql – Senthil 2011-04-20 02:09:22

回答

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

*標註是引用的表的所有列的快捷方式,但你仍然可以添加更多的列,如常量,如果你想。

+0

我一直在尋找這個。非常感謝。 – Divya 2011-04-23 05:41:30

0

對於方法1: 由於子查詢返回單個插入的多個值,因此錯誤顯示。

方法2:

該方法有效,因爲,要創建的表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特有的,ü可能必須相應地調整它。讓我知道,如果你有任何問題

+0

其實我的問題是我有一個表和對於特定的值(第4列)必須添加一個類型(第3列)。所以表2是名稱和年齡的不同值。對於那些沒有這種類型和價值的名字和年齡。我必須在表中爲名稱和年齡的所有不同組合添加新行。因此,我提取了名稱和年齡的不同值,並嘗試添加類型和值,並再次添加到現有表中。 – Divya 2011-04-20 03:39:17

+0

非常感謝您的回答 – Divya 2011-04-23 05:42:50