Som Henrik skrev kan du använda dblink för att ansluta fjärrdatabas och hämta resultat. Till exempel:
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 post-pseudo-typ (endast för funktions argument eller resultattyp), vilket gör att du kan söka efter data från en annan (okänd) tabell.
Redigera:
Du kan göra det som ett förberett uttalande om du vill och det fungerar lika bra:
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;
Redigera (ja, en annan):
Jag såg precis din reviderade fråga (stängd som dubblett, eller bara väldigt lik denna).
Om min uppfattning är korrekt (postgres har tbla och dbtest har tblb och du vill fjärrinfoga med lokalt välj , inte fjärrval med lokal infogning enligt ovan):
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;'
);
Jag gillar inte den kapslade dblinken, men AFAIK kan jag inte referera till tblB i dblink_exec-kroppen. Använd LIMIT för att ange topp 20 rader, men jag tror att du måste sortera dem med ORDER BY-satsen först.