Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

requête d'insertion après un WITH ?


Sujet :

Requêtes PostgreSQL

  1. #1
    Futur Membre du Club
    requête d'insertion après un WITH ?
    Bonjour, pour un projet de développement de page admin qui permet de faire des ajouts et des suppression dans la base grâce à une interface web j'ai un petit problème...

    Il y a une page qui permet de gérer des fonctions (dans la base de donnée il y a donc une table fonction composé de 2 champs : id, libelle).
    Or dans cette table il existe plusieurs libelle avec des ID différent (chaque fonction est plus tard lié à un secteur donc il se peut que certains secteurs ai le même libelle de fonction)

    Je cherche donc à faire un UPDATE de cette table afin de rajouter le trigramme du secteur devant la fonction.

    J'ai les tables suivantes :

    fonction (id,libelle,up_libelle*)
    machine(id, libelle, secteur_id)
    secteur(id,libelle)
    codepannes(id, fonction_id,machine_id)

    * c'est dans ce champ qui est pour le moment vide que je souhaite insérer le nouveau libelle avec le trigramme

    je fais donc des jointures pour remonter de la fonction jusqu'au secteur en question, puis je prend le trigramme du secteur et enfin je concatène le tout.

    j'ai donc fais :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH fonction_up AS (SELECT DISTINCT f.id AS id,CONCAT(SUBSTRING(up.libelle, 4, 3),'_',f.libelle) AS fonction, f.libelle AS libelle
                  FROM maint_ta_codepannes cp
                  JOIN maint_ta_fonction f ON cp.fonction_id = f.id
                  JOIN maint_ta_machines m ON cp.machine_id = m.id
                  JOIN serm_secteurs up ON up.id = m.secteur_id
                  WHERE f.libelle = 'Presse'
                 )
    UPDATE maint_ta_fonction SET maint_ta_fonction.up_libelle = fonction_up.fonction
    FROM fonction_up;


    Le WITH marche très bien en revanche j'ai fais des recherches ne trouvant pas la solution du UPDATE, j'ai tenté beaucoup de syntaxes différentes, j'ai tenté un WITH suivi d'un MERGE INTO puis faire le UPDATE quand sa match... mais apparemment pgsql est assez fermé pour tout ça et ne prend pas beaucoup de syntaxe en compte ...

    quelqu'un pourrait me guider sur la bonne voie ?

  2. #2
    Futur Membre du Club
    solution
    C'est bon j'ai trouvé un moyen j'ai utilisé une table temporaire, je met la solution au cas où :


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TEMPORARY TABLE table AS (SELECT DISTINCT f.id AS id, CONCAT(SUBSTRING(up.libelle, 4, 3),'_',f.libelle) AS fonction, f.libelle AS libelle
                         FROM maint_ta_codepannes cp
                         JOIN maint_ta_fonction f ON cp.fonction_id = f.id
                         JOIN maint_ta_machines m ON cp.machine_id = m.id
                         JOIN serm_secteurs up ON up.id = m.secteur_id                                          
                        );
     
    UPDATE maint_ta_fonction ta
    SET up_libelle = t.fonction 
    FROM table t
    WHERE ta.id= t.id;

###raw>template_hook.ano_emploi###