Saltar al contenido

postgresql: INSERT INTO … (SELECT * …)

Solución:

Como escribió Henrik, puede usar dblink para conectar la 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 pseudo-tipo 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 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 simplemente muy similar a esta).

Si mi entendimiento es correcto (postgres tiene tbla y dbtest tiene tblb y quieres inserción remota con selección local, no selección remota con inserción local como anteriormente):

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 de dblink_exec. Use LIMIT para especificar las 20 filas principales, pero creo que primero debe ordenarlas usando la cláusula ORDER BY.

Si desea insertar en la columna especificada:

INSERT INTO table (time)
(SELECT time FROM 
    dblink('dbname=dbtest', 'SELECT time FROM tblB') AS t(time integer) 
    WHERE time > 1000
);

Puede utilizar dblink para crear una vista que se resuelve en otra base de datos. Esta base de datos puede estar en otro servidor.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *