PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

postgresql:INSERT IN... (SELECT * ...)

Come ha scritto Henrik, puoi usare dblink per connettere il database remoto e recuperare il risultato. Ad esempio:

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 ha uno pseudo-tipo di record (solo per l'argomento della funzione o il tipo di risultato), che ti consente di interrogare i dati da un'altra tabella (sconosciuta).

Modifica:

Puoi farlo come una dichiarazione preparata se lo desideri e funziona ugualmente:

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;

Modifica (sì, un altro):

Ho appena visto la tua domanda modificata (chiusa come duplicata o semplicemente molto simile a questa).

Se la mia comprensione è corretta (postgres ha tbla e dbtest ha tblb e vuoi inserimento remoto con selezione locale , non selezione remota con inserimento locale come sopra):

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

Non mi piace quel dblink annidato, ma AFAIK non posso fare riferimento a tblB nel corpo dblink_exec. Usa LIMIT per specificare le prime 20 righe, ma penso che tu debba prima ordinarle usando la clausola ORDER BY.