Как писал Хенрик, вы можете использовать dblink для подключения к удаленной базе данных и получения результатов.Например:
psql dbtest
CREATE TABLE tblB (id serial, time integer);
INSERT INTO tblB (time) VALUES (5000), (2000);
psql postgres
CREATE TABLE tblA (id serial, time integer);
INSERT INTO tblA
SELECT id, time
FROM dblink('dbname=dbtest', 'SELECT id, time FROM tblB')
AS t(id integer, time integer)
WHERE time > 1000;
TABLE tblA;
id | time
----+------
1 | 5000
2 | 2000
(2 rows)
PostgreSQL имеет record псевдотип (только для аргумента функции или типа результата), что позволяет запрашивать данные из другой (неизвестной) таблицы.
Редактировать:
Вы можете сделать это как подготовленное утверждение, если хотите, и оно также работает:
PREPARE migrate_data (integer) AS
INSERT INTO tblA
SELECT id, time
FROM dblink('dbname=dbtest', 'SELECT id, time FROM tblB')
AS t(id integer, time integer)
WHERE time > $1;
EXECUTE migrate_data(1000);
-- DEALLOCATE migrate_data;
Редактировать (да, другое):
Я простоувидел ваш пересмотренный вопрос (закрыт как дубликат или просто очень похож на это).
Если мое понимание верно (postgres имеет tbla, а dbtest имеет tblb, и вы хотите удаленная вставкас локальным выбором , а не дистанционный выбор с локальной вставкой , как указано выше):
psql dbtest
SELECT dblink_exec
(
'dbname=postgres',
'INSERT INTO tbla
SELECT id, time
FROM dblink
(
''dbname=dbtest'',
''SELECT id, time FROM tblb''
)
AS t(id integer, time integer)
WHERE time > 1000;'
);
Мне не нравится эта вложенная dblink, но AFAIK Я не могу ссылаться на tblBв теле dblink_exec .Используйте LIMIT для указания 20 верхних строк, но я думаю, что вам нужно сначала отсортировать их, используя предложение ORDER BY.