PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

postgresql:EINFÜGEN IN ... (SELECT * ...)

Wie Henrik schrieb, können Sie dblink verwenden, um eine entfernte Datenbank zu verbinden und das Ergebnis abzurufen. Zum Beispiel:

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 hat einen Datensatz-Pseudotyp (nur für das Argument oder den Ergebnistyp einer Funktion), mit dem Sie Daten aus einer anderen (unbekannten) Tabelle abfragen können.

Bearbeiten:

Sie können es als vorbereitete Anweisung machen, wenn Sie möchten, und es funktioniert auch:

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;

Bearbeiten (ja, noch einer):

Ich habe gerade Ihre überarbeitete Frage gesehen (als Duplikat geschlossen oder dieser nur sehr ähnlich).

Wenn mein Verständnis richtig ist (postgres hat tbla und dbtest hat tblb und Sie möchten remote insert with local select , nicht Fernauswahl mit lokaler Einfügung wie oben):

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

Ich mag diesen verschachtelten dblink nicht, aber AFAIK kann ich im Körper von dblink_exec nicht auf tblB verweisen. Verwenden Sie LIMIT, um die obersten 20 Zeilen anzugeben, aber ich denke, Sie müssen sie zuerst mit der ORDER BY-Klausel sortieren.