Jak napsal Henrik, můžete použít dblink pro připojení vzdálené databáze a načtení výsledku. Například:
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 má pseudotyp záznamu (pouze pro argument funkce nebo typ výsledku), který vám umožňuje dotazovat se na data z jiné (neznámé) tabulky.
Upravit:
Pokud chcete, můžete to udělat jako připravené prohlášení a funguje to také:
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;
Upravit (jo, další):
Právě jsem viděl vaši upravenou otázku (uzavřenou jako duplicitní nebo jen velmi podobnou této).
Pokud tomu rozumím správně (postgres má tbla a dbtest má tblb a chcete vzdálené vložení s místním výběrem , nikoli vzdálený výběr s místní vložkou jako výše):
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;'
);
Nelíbí se mi ten vnořený dblink, ale AFAIK nemůžu odkazovat na tblB v těle dblink_exec. Použijte LIMIT k určení prvních 20 řádků, ale myslím, že je nejprve musíte seřadit pomocí klauzule ORDER BY.