Както Хенрик писа, можете да използвате 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 има псевдотип на запис (само за аргумент на функцията или тип резултат), който ви позволява да заявявате данни от друга (неизвестна) таблица.
Редактиране:
Можете да го направите като подготвено изявление, ако искате и той също работи:
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.