Som Henrik skrev kan du bruge dblink til at forbinde ekstern database og hente resultat. For eksempel:
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 har record pseudo-type (kun for funktions argument eller resultattype), som giver dig mulighed for at forespørge data fra en anden (ukendt) tabel.
Rediger:
Du kan lave det som forberedt erklæring, hvis du vil, og det virker også:
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;
Rediger (ja, en anden):
Jeg har lige set dit reviderede spørgsmål (lukket som dublet, eller bare meget lig dette).
Hvis min forståelse er korrekt (postgres har tbla og dbtest har tblb og du vil have fjernindsættelse med lokalt vælg , ikke fjernvalg med lokal indsættelse som ovenfor):
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;'
);
Jeg kan ikke lide den indlejrede dblink, men AFAIK kan jeg ikke referere til tblB i dblink_exec body. Brug LIMIT til at angive de øverste 20 rækker, men jeg tror, du skal sortere dem ved at bruge ORDER BY-klausulen først.