IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Solution équivalente au MERGE ? [9.4]


Sujet :

Requêtes PostgreSQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2019
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Solution équivalente au MERGE ?
    Bonjour, actuellement pour un projet dans mon entreprise ou je suis alternant,

    j'ai besoin de récupérer les données d'une table1 pour UPDATE ou INSERT dans une table2, or j'utilise postgresql 9.4.26 et il me semble que le MERGE ne fonctionne pas...

    ex:

    Table1
    Franz Bertrand Lyon

    Table2
    Dupont Georges Paris
    Franz Bertrand Nantes
    Douglas Kurt Marseille

    Table2 (après update)
    Dupont Georges Paris
    Franz Bertrand Lyon
    Douglas Kurt Marseille


    Auriez-vous des idées ?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    ben oui, mais PostgreSQL c'est gratuit, alors faut pas trop en demander !

    Non, rien d'équivalent au MERGE, mais on contourne en écrivant une procédure avec une transaction explicite.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Avec la version 9.4, effectivement, rien d'approchant à part à passer par une fonction trigger...

    Mais depuis la version 9.5, il y a la clause ON CONFLICT ... DO UPDATE... dans la commande INSERT qui permet de s'approcher du MERGE.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par ced Voir le message
    ...
    Mais depuis la version 9.5, il y a la clause ON CONFLICT ... DO UPDATE... dans la commande INSERT qui permet de s'approcher du MERGE....
    Approcher ! Oui, mais de très très loin, dans le brouillard !
    parce qu'il n'y a possibilité de placer aucun filtre et c'est limité à l'insert...
    or le MERGE permet non seulement de filtrer initialement (impossible dans PG), mais dans chaque branche (impossible dans PG) et de prévoir INSERT, UPDATE ou DELETE (voir les 3) ce qui est aussi impossible dans PG !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    En reprenant l'exemple que vous donnez initialement, il existe quand même des possibilités pour faire ce que vous demandez, même en 9.4.
    Prenons 2 tables qui ressemblent à celles de votre exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE table1 (nom TEXT, prenom TEXT, ville TEXT);
    CREATE TABLE table2 (nom TEXT, prenom TEXT, ville TEXT);
     
    INSERT INTO table1 (nom, prenom, ville)
    VALUES ('Franz', 'Bertrand', 'Lyon')
    , ('Durand', 'Jean', 'Lille');
     
     
    INSERT INTO table2 (nom, prenom, ville)
    VALUES ('Dupont', 'Georges', 'Paris')
    , ('Franz', 'Bertrand', 'Nantes')
    , ('Douglas', 'Kurt', 'Marseille');
    Voilà leur contenu :
    Table 1 :
    nom   |prenom  |ville
    ------|--------|-----
    Franz |Bertrand|Lyon 
    Durand|Jean    |Lille
    
    Table 2 :
    nom    |prenom  |ville    
    -------|--------|---------
    Dupont |Georges |Paris    
    Franz  |Bertrand|Nantes   
    Douglas|Kurt    |Marseille
    
    Pour mettre à jour la ligne de table2 commune à table1 selon le nom et le prénom, et ajouter la ligne de table1 absente de table2 en une seule requête, on peut utiliser une CTE, par exemple comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    WITH maj AS
    (
        UPDATE table2 t2
        SET ville = t1.ville
        FROM table1 t1
        WHERE t2.nom = t1.nom
            AND t2.prenom = t1.prenom
        RETURNING t2.*
    ) 
    INSERT INTO table2 (nom, prenom, ville)
    SELECT t1.nom, t1.prenom, t1.ville
    FROM table1 t1
    WHERE NOT EXISTS (
        SELECT 1
        FROM maj
        WHERE t1.nom = maj.nom
        AND t1.prenom = maj.prenom
    );
    Résultat sur table2 :
    nom    |prenom  |ville    
    -------|--------|---------
    Dupont |Georges |Paris    
    Douglas|Kurt    |Marseille
    Franz  |Bertrand|Lyon     
    Durand |Jean    |Lille    
    Mais encore une fois, ce n'est pas un MERGE, loin de là... Ça répond juste à votre exemple...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2019
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2019
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup pour votre aide, j'étais effectivement parti sur une requête comme ça mais j'avais quelques problèmes avec, je vais tester ça


    Je reste avec le même problème que j'avais avec ma requête, lorsque je lance cette requête l'UPDATE n'est pas faite et donc je me retrouve avec ma table de base + tout les INSERT donc j'ai beaucoup de doublon

    pour reprendre l'exemple ma table 2 devient :

    nom    |prenom  |ville    
    -------|--------|---------
    Dupont |Georges |Paris    
    Douglas|Kurt    |Marseille
    Franz  |Bertrand|Lyon
    Franz  |Bertrand|Nantes        
    Durand |Jean    |Lille    
    J'essaye de comprendre ou ça bloque ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 03/01/2013, 12h07
  2. Réponses: 3
    Dernier message: 12/11/2012, 11h33
  3. [1.x] Solutions "merge" de 2 forms de relations n-n
    Par Gauldo dans le forum Symfony
    Réponses: 14
    Dernier message: 19/03/2010, 16h34
  4. [XHTML 1.0] Redirection valide dans un noscript ou solution équivalente
    Par Rolf-IV dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 03/11/2009, 08h32
  5. Solution équivalente à "TxQuery" mais gratuite
    Par gduo200 dans le forum Bases de données
    Réponses: 0
    Dernier message: 05/09/2007, 03h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo