sql >> Base de Datos >  >> RDS >> PostgreSQL

postgresql:INSERTAR EN... (SELECCIONAR *...)

Como escribió Henrik, puede usar dblink para conectar una base de datos remota y obtener el resultado. Por ejemplo:

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 tiene un pseudotipo de registro (solo para el argumento de la función o el tipo de resultado), lo que le permite consultar datos de otra tabla (desconocida).

Editar:

Puede hacerlo como una declaración preparada si lo desea y también funciona:

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;

Editar (sí, otro):

Acabo de ver su pregunta revisada (cerrada como duplicada o muy similar a esta).

Si mi comprensión es correcta (postgres tiene tbla y dbtest tiene tblb y desea inserción remota con selección local , no selección remota con inserción local como arriba):

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;'
);

No me gusta ese dblink anidado, pero AFAIK no puedo hacer referencia a tblB en el cuerpo dblink_exec. Use LIMIT para especificar las 20 filas principales, pero creo que primero debe ordenarlas usando la cláusula ORDER BY.