我不确定它的标准SQL:

 INSERT INTO tblA
 (SELECT id, time
    FROM tblB
   WHERE time > 1000)

我要查找的是:如果tblA和tblB位于不同的数据库服务器中,该怎么办。

PostgreSql是否提供任何实用程序或任何功能来帮助使用INSERT query with PGresult struct
我的意思是SELECT id, time FROM tblB ...将使用PGresult*返回PQexec。是否可以在另一个PQexec中使用此结构来执行INSERT命令。

编辑:
如果不可能的话,我将从PQresult *中提取值并创建多个INSERT语句语法,例如:
INSERT INTO films (code, title, did, date_prod, kind) VALUES
    ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
    ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');

是否可以据此创建准备好的语句!! :(

最佳答案

正如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具有record伪类型(仅用于函数的参数或结果类型),它使您可以从另一个(未知)表中查询数据。

编辑:

如果需要,可以将其作为准备好的语句,并且效果很好:
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;

编辑(是的,另一个):

我刚刚看到了您的revised question(关闭为重复项,或者与此非常相似)。

如果我的理解是正确的(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,但是AFAIK我无法在dblink_exec主体中引用tblB。使用LIMIT指定前20行,但我认为您需要首先使用ORDER BY子句对它们进行排序。

08-19 00:19