2015-12-10 5 views
2

Ma version de Postgres est:Comment INSERT INTO table de requête dynamique?

"PostgreSQL 9.4.4, compiled by Visual C++ build 1800, 32-bit" 

Disons que j'ai deux tables Table1 et Table2, qui ont des colonnes col1 et col2 respectivement.

CREATE TABLE Table1(col1 int); 
CREATE TABLE Table2(col2 int); 

Il est une autre table Table3 le stockage d'une formule pour la migration de données Table1 à Table2:

CREATE TABLE Table3 (  
    tbl_src varchar(200), 
    col_src varchar(500), 
    tbl_des varchar(200), 
    col_des varchar(100), 
    condition varchar(500) 
); 

INSERT INTO Table3 (tbl_src, col_src, tbl_des, col_des, condition) 
SELECT 'Table1','col1','Table2','col2',NULL 

Comment compiler cette formule dans une requête dynamique et insertion dans la table de destination?

+0

@ErwinBrandstetter mis à jour la version en poste. Et je ne veux pas créer 100 lignes dans la table de destination. Table1 est source et Table2 est ma desination.We peut ignorer la colonne de condition.how comment leurs colonnes sont liées/mappés est stocké dans Table3. Le défi est de le transformer en dynamic sql et de l'insérer dans la table de destination. Sir ma question est liée à poster à [link] (http://stackoverflow.com/questions/34133244/how-to-get-result-from-dynamic-sql-in-postgres) et à [link] (http : //stackoverflow.com/questions/34172019/insert-from-dynamic-query-in-postgres) –

+0

@ErwinBrandstetter Monsieur, j'avais un souhait que vous puissiez voir mon problème car j'ai remarqué que vous avez beaucoup de postgres problèmes. Merci d'avoir rendu le vœu réel. –

+0

J'ai annulé vos dernières modifications et vous suggère de commencer une nouvelle question pour la nouvelle question. Vous pouvez trouver votre version dans [modifier l'historique ici] (http://stackoverflow.com/posts/34194889/revisions). –

Répondre

1

La requête de base pour construire la commande dynamique:

SELECT format('INSERT INTO %I (%I) SELECT %I FROM %I' 
      , tbl_des, col_des, col_src, tbl_src) As sql 
FROM table3; 

Cela produit une requête comme:

INSERT INTO "Table2" (col2) SELECT col1 FROM "Table1" 

Notez la majuscule orthographe cité. Contrairement aux commandes SQL, où les identificateurs sans guillemets sont automatiquement mis en minuscules, les chaînes de votre tableau sont désormais sensibles à la casse!

Je vous suggère jamais identifiants double et devis utilisation légale, les noms minuscules exclusivement.

Automatiser:

DO 
$$BEGIN 
    EXECUTE (
     SELECT format('INSERT INTO %I (%I) SELECT %I FROM %I' 
        , tbl_des, col_des, col_src, tbl_src) As sql 
     FROM table3 
     -- WHERE table3_id = 123 -- select only *one* row! 
    ); 
END$$; 

Vous besoin de comprendre la fonction format(). Read the manual.

Vous pouvez envelopper ceci en fonction de plpgsql et ainsi passer des paramètres supplémentaires:

+0

Monsieur cela résolu complètement un à un cartographie. Mais que se passe-t-il s'il y a trois colonnes de table1 et mappées à trois colonnes dans table2. J'ai modifié l'exemple pour la même chose en post. –

+0

@HarsimranjeetSingh: S'il vous plaît ne pas changer la nature de la question après une réponse a été donnée.J'ai essayé d'obtenir des éclaircissements avant de répondre - et la clarification est toujours la bienvenue, mais changer la nature de la question ne l'est pas. Commencez une nouvelle question pour la nouvelle question - vous pouvez toujours lier à celui-ci pour le contexte. –

+0

Monsieur, j'ai posté la même chose à [link] (http://stackoverflow.com/questions/34199385/how-to-insert-into-table-having-multiple-column-from-dynamic-query) –