Như Henrik đã viết, bạn có thể sử dụng dblink để kết nối cơ sở dữ liệu từ xa và tìm nạp kết quả. Ví dụ:
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 có kiểu giả bản ghi (chỉ dành cho đối số của hàm hoặc kiểu kết quả), cho phép bạn truy vấn dữ liệu từ một bảng (không xác định) khác.
Chỉnh sửa:
Bạn có thể làm cho nó như một tuyên bố chuẩn bị sẵn nếu bạn muốn và nó hoạt động tốt:
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;
Chỉnh sửa (vâng, khác):
Tôi vừa thấy câu hỏi đã sửa đổi của bạn (bị đóng là trùng lặp hoặc rất giống với câu hỏi này).
Nếu sự hiểu biết của tôi là đúng (postgres có tbla và dbtest có tblb và bạn muốn chèn từ xa với lựa chọn cục bộ , không phải chọn từ xa với chèn cục bộ như trên):
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;'
);
Tôi không thích dblink lồng nhau đó, nhưng AFAIK, tôi không thể tham chiếu đến tblB trong phần thân dblink_exec. Sử dụng LIMIT để chỉ định 20 hàng trên cùng, nhưng tôi nghĩ trước tiên bạn cần sắp xếp chúng bằng mệnh đề ORDER BY.