postgresql: INSERT INTO… (SELECT *…)

Je ne sais pas si son SQL standard:

INSERT INTO tblA (SELECT id, time FROM tblB WHERE time > 1000) 

Ce que je recherche, c’est: si tblA et tblB se trouvent dans différents serveurs de firebase database .

PostgreSql offre-t-il un utilitaire ou une fonctionnalité permettant d’utiliser la INSERT query with PGresult struct

Je veux dire que SELECT id, time FROM tblB ... renverra un PGresult* en utilisant PQexec . Est-il possible d’utiliser cette structure dans un autre PQexec pour exécuter une commande INSERT.

MODIFIER:
Si ce n’est pas possible, j’extraire les valeurs de PQresult * et créer une syntaxe d’instruction INSERT multiple comme:

 INSERT INTO films (code, title, did, date_prod, kind) VALUES ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'), ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy'); 

Est-il possible de créer une déclaration préparée à partir de cela! 🙁

Comme Henrik l’a écrit, vous pouvez utiliser dblink pour connecter une firebase database distante et récupérer le résultat. Par exemple:

 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 a un pseudo-type d’ enregistrement (uniquement pour l’argument de la fonction ou le type de résultat), qui vous permet d’interroger les données d’une autre table (inconnue).

Modifier:

Vous pouvez le faire comme déclaration préparée si vous voulez et cela fonctionne aussi bien:

 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; 

Edit (oui, un autre):

Je viens de voir votre question révisée (fermée en double, ou très similaire à celle-ci).

Si ma compréhension est correcte (postgres a tbla et dbtest a tblb et vous voulez insérer à distance avec select local , pas sélectionner à distance avec insert local comme ci-dessus):

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

Je n’aime pas ce dblink nested, mais AFAIK je ne peux pas faire référence à tblB dans le corps de dblink_exec . Utilisez LIMIT pour spécifier les 20 premières lignes, mais je pense que vous devez les sortinger en utilisant d’abord la clause ORDER BY.

Si vous voulez insérer dans la colonne spécifiée:

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

Vous pouvez utiliser dblink pour créer une vue résolue dans une autre firebase database. Cette firebase database peut être sur un autre serveur.

Cette notation (d’abord vue ici ) semble utile aussi:

 insert into postagem ( resumopostagem, textopostagem, dtliberacaopostagem, idmediaimgpostagem, idcatolico, idminisermao, idtipopostagem ) select resumominisermao, textominisermao, diaminisermao, idmediaimgminisermao, idcatolico , idminisermao, 1 from minisermao 

Voici une solution alternative, sans utiliser dblink .

Supposons que B représente la firebase database source et que A représente la firebase database cible:

  1. Copier la table de la firebase database source vers la firebase database cible:

     pg_dump -t   | psql  
  2. Ouvrez l’invite psql, connectez-vous à target_db et utilisez une simple insert :

     psql # \c ; # INSERT INTO (id, x, y) SELECT id, x, y FROM ; 
  3. À la fin, supprimez la copie de source_table que vous avez créée dans target_table .

     # DROP TABLE ;