sql >> Databáze >  >> RDS >> PostgreSQL

postgresql:INSERT INTO ... (VYBRAT * ...)

Jak napsal Henrik, můžete použít dblink pro připojení vzdálené databáze a načtení výsledku. Například:

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 má pseudotyp záznamu (pouze pro argument funkce nebo typ výsledku), který vám umožňuje dotazovat se na data z jiné (neznámé) tabulky.

Upravit:

Pokud chcete, můžete to udělat jako připravené prohlášení a funguje to také:

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;

Upravit (jo, další):

Právě jsem viděl vaši upravenou otázku (uzavřenou jako duplicitní nebo jen velmi podobnou této).

Pokud tomu rozumím správně (postgres má tbla a dbtest má tblb a chcete vzdálené vložení s místním výběrem , nikoli vzdálený výběr s místní vložkou jako výše):

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

Nelíbí se mi ten vnořený dblink, ale AFAIK nemůžu odkazovat na tblB v těle dblink_exec. Použijte LIMIT k určení prvních 20 řádků, ale myslím, že je nejprve musíte seřadit pomocí klauzule ORDER BY.



  1. Nejrychlejší způsob, jak provádět vnořené hromadné vkládání s použitím scope_identity()?

  2. Na Duplicate Key Update to samé jako vložení

  3. Jak přidat komentáře v SQL?

  4. Jak seřadit řádky v oddílu v SQL