Jak napisał Henrik, można użyć dblink do połączenia zdalnej bazy danych i pobrania wyniku. Na przykład:
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 posiada pseudotyp rekordu (tylko dla argumentu lub typu wyniku funkcji), który pozwala na zapytanie o dane z innej (nieznanej) tabeli.
Edycja:
Możesz zrobić to jako przygotowane zestawienie, jeśli chcesz i to również działa:
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;
Edytuj (tak, inny):
Właśnie zobaczyłem Twoje poprawione pytanie (zamknięte jako duplikat lub po prostu bardzo podobne do tego).
Jeśli moje zrozumienie jest poprawne (postgres ma tbla, a dbtest ma tblb i chcesz zdalne wstawianie z lokalnym wyborem , a nie zdalny wybór za pomocą wstawiania lokalnego jak wyżej):
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;'
);
Nie podoba mi się ten zagnieżdżony dblink, ale AFAIK Nie mogę odwoływać się do tblB w ciele dblink_exec. Użyj LIMIT, aby określić 20 pierwszych wierszy, ale myślę, że najpierw musisz je posortować za pomocą klauzuli ORDER BY.