Zoals Henrik schreef, kunt u dblink gebruiken om de externe database te verbinden en het resultaat op te halen. Bijvoorbeeld:
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 heeft een record-pseudotype (alleen voor het argument van de functie of het resultaattype), waarmee u gegevens uit een andere (onbekende) tabel kunt opvragen.
Bewerken:
Je kunt het als voorbereide verklaring maken als je wilt en het werkt ook:
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;
Bewerken (ja, nog een):
Ik zag zojuist je herziene vraag (gesloten als duplicaat, of lijkt er erg veel op).
Als ik het goed heb begrepen (postgres heeft tbla en dbtest heeft tblb en je wilt remote insert met local select , niet extern selecteren met lokaal invoegen zoals hierboven):
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;'
);
Ik hou niet van die geneste dblink, maar AFAIK ik kan niet verwijzen naar tblB in dblink_exec body. Gebruik LIMIT om de bovenste 20 rijen op te geven, maar ik denk dat je ze eerst moet sorteren met de ORDER BY-clausule.