sql >> Databasteknik >  >> RDS >> PostgreSQL

postgresql:INSERT INTO ... (VÄLJ * ...)

Som Henrik skrev kan du använda dblink för att ansluta fjärrdatabas och hämta resultat. Till exempel:

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 har post-pseudo-typ (endast för funktions argument eller resultattyp), vilket gör att du kan söka efter data från en annan (okänd) tabell.

Redigera:

Du kan göra det som ett förberett uttalande om du vill och det fungerar lika bra:

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;

Redigera (ja, en annan):

Jag såg precis din reviderade fråga (stängd som dubblett, eller bara väldigt lik denna).

Om min uppfattning är korrekt (postgres har tbla och dbtest har tblb och du vill fjärrinfoga med lokalt välj , inte fjärrval med lokal infogning enligt ovan):

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

Jag gillar inte den kapslade dblinken, men AFAIK kan jag inte referera till tblB i dblink_exec-kroppen. Använd LIMIT för att ange topp 20 rader, men jag tror att du måste sortera dem med ORDER BY-satsen först.



  1. REGEX för att välja n:te värde från en lista, vilket tillåter nollvärden

  2. Hur man använder array_agg() för varchar[]

  3. Hur visar man Oracle-schemastorlek med SQL-fråga?

  4. SQUARE() Exempel i SQL Server