Seperti yang ditulis Henrik, Anda dapat menggunakan dblink untuk menghubungkan basis data jarak jauh dan mengambil hasil. Misalnya:
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 memiliki record pseudo-type (hanya untuk argumen fungsi atau tipe hasil), yang memungkinkan Anda meminta data dari tabel lain (tidak diketahui).
Sunting:
Anda dapat menjadikannya sebagai pernyataan yang disiapkan jika Anda mau dan itu juga berfungsi:
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;
Sunting (ya, yang lain):
Saya baru saja melihat pertanyaan Anda yang telah direvisi (ditutup sebagai duplikat, atau sangat mirip dengan ini).
Jika pemahaman saya benar (postgres memiliki tbla dan dbtest memiliki tblb dan Anda ingin menyisipkan jarak jauh dengan pilihan lokal , bukan pilihan jarak jauh dengan sisipan lokal seperti di atas):
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;'
);
Saya tidak suka dblink bersarang itu, tetapi AFAIK saya tidak dapat merujuk ke tblB di badan dblink_exec. Gunakan LIMIT untuk menentukan 20 baris teratas, tetapi menurut saya Anda perlu mengurutkannya menggunakan klausa ORDER BY terlebih dahulu.