Henrikが書いたように、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は好きではありませんが、dblink_exec本体でtblBを参照することはできません。 LIMITを使用して上位20行を指定しますが、最初にORDERBY句を使用してそれらを並べ替える必要があると思います。