2013-07-23 122 views
-1

我是一個總的SQL noob。我試圖在表中爲每個來自另一個表的部分列表創建一個新記錄。我無法獲得循環語法。基本上,這裏的僞碼,我想要做的事:循環和插入PostgreSQL PGADMIN III

FOR EACH item FROM "SCHEMA1".table1.field1 WHERE table1.field2 = 500 OR table1.field2 = 900 LOOP 
USE "SCHEMA1".table2 
INSERT INTO "SCHEMA1".table2 (column1, column2, column3) 
    VALUES (row_number(), table1.field1, "done") 
END LOOP; 

table1的大約有4300條記錄,我想從複製到另一個現有表作爲新記錄約90特定記錄一個字段(額外數據)。這兩個表都存在於一個模式中,但服務器有十幾個,有重複的表和字段。

感謝您抽出寶貴的時間教育老noob。

回答

0

我不知道你用什麼方法調用row_number()函數。
注意,根據ROW_NUMBER()的文件:http://www.postgresql.org/docs/8.4/static/functions-window.html

注意,這些功能必須使用窗函數 語法調用;這是一個OVER子句是必需的。

如此簡單地調用row_number()而不使用OVER(...)子句會給您一個語法錯誤。
這裏http://www.postgresql.org/docs/8.4/static/sql-expressions.html#SYNTAX-WINDOW-FUNCTIONS你可以找到詳細的描述如何使用Windows函數在postgresql中調用。

總之,從表中選擇行,並把它們(一些修改後)插入到另一個表中您可以使用一個SQL命令,例如:

INSERT INTO table2 (column1, column2, column3) 
Select row_number() over (order by 1), 
     table1.field1, 
     'done' 
FROM table1 
WHERE table1.field2 = 500 OR table1.field2 = 900; 

下面是一個簡單SQLFiddle demo



在這裏你可以找到的語法的描述:http://www.postgresql.org/docs/8.1/static/sql-insert.html
在此查詢中,我們使用插件的這個變體:

INSERT INTO table [ (column [, ...]) ] 
    { query } 

執行該查詢(只需選擇XXX YYY FROM等),然後插入此查詢(查詢返回的行)到的結果。

+0

謝謝@kordirko,我會嘗試,當我有機會。我堅持使用舊版本的postgres和一個複雜的數據庫,只能從非常殘缺的GUI程序訪問。創建這些90,大多數相同的記錄將需要幾天的時間。我希望能夠使用PGADMIN將其修整爲幾小時或幾分鐘,就像我與其他更簡單的任務一樣。 row_number()被使用,因爲ID列不自動增量,我需要唯一的ID。感謝您抽出寶貴的時間。 –