2013-07-23 5 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 конкретных записей, скопированных в другую существующую таблицу в качестве новых записей (с дополнительными данными). Обе таблицы существуют в одной схеме, но на серверах есть дюжина или около того с дублирующимися таблицами и полями.

Спасибо, что нашли время, чтобы обучить старый нуб.

ответ

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 } 

, который выполняет запрос (просто выбрать ххх FROM YYY и т.д.), а затем вставляет результат этого запроса (строки, возвращенные запросом) к таблице.

+0

Спасибо @kordirko, я попробую, когда у меня появится шанс. Я застрял со старой версией postgres и сложной базой данных, доступной только из очень искалеченной GUI-программы. Создание этих 90, в основном идентичных записей займет буквально несколько дней. Я надеялся использовать PGADMIN, чтобы обрезать это до нескольких часов или минут, так как у меня есть другие, более простые задачи. Row_number() использовался, потому что столбец идентификатора не автоинкремент, и мне нужны уникальные идентификаторы. Спасибо, что нашли время. –

Смежные вопросы