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

PostgreSQL Discussion :

MERGE et POSTGRE [9.2]


Sujet :

PostgreSQL

  1. #1
    Membre éclairé Avatar de _Carole
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 105
    Par défaut MERGE et POSTGRE
    Bonjour,
    Je m'étais renseignée il y a quelques mois rapidement sur l'instruction MERGE et j'avais compris son fonctionnement seulement voilà, en approfondissant mes recherches, j'ai cru comprendre que POSTGRE n'avait pas implémenté cette instruction.

    Aussi, j'ai donc regardé du côté des 'UPSERT' et de la solution de faire deux requêtes distinctes mais j'ai du mal à comprendre et à voir ce qui conviendrais le plus à ma situation.

    Voici donc ma requête MERGE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    MERGE INTO personnel t1
    USING (SELECT DISTINCT individu, equipe FROM rsmind) t2
    ON (t1.nom=t2.individu)
    WHEN MATCHED THEN 
    UPDATE SET t1.equipe=t2.equipe
    WHEN NOT MATCHED THEN
    INSERT (t1.nom,t1.equipe) VALUES (t2.individu,t2.equipe);
    Qui insert un nouvel individu s'il n'est pas dans la table 'personnel' ou met à jour le nom de son équipe s'il existe déjà. ('rsmind' est une table de travail/temporaire)

    Aussi, pourriez vous m'aider à formuler cette requête pour PostgreSql ?

    PS: La solution de vider et remplir la table n'est pas envisageable.

    Merci d'avance et Bonne journée !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 132
    Par défaut
    Quelque chose dans ce goût là :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    INSERT INTO personnel
        (   nom
        ,   equipe
        )
    SELECT  rsm.individu
        ,   MAX(rsm.equipe) equipe 
    FROM    rsmind  rsm
    WHERE   NOT EXISTS
            (   SELECT  NULL
                FROM    personnel   prs
                WHERE   prs.nom = rsm.individu
            )
    GROUP BY rsm.individu
    ;
    UPDATE  personnel   prs
    SET     prs.equipe  =
            (   SELECT  MAX(rsm.equipe)
                FROM    rsmind  rsm
                WHERE   prs.nom = rsm.individu
            )
    WHERE   EXISTS
            (   SELECT  NULL
                FROM    rsmind  rsm
                WHERE   prs.nom     = rsm.individu
                HAVING  prs.equipe  <> MAX(rsm.equipe)
            )
    ;
    A noter que dans ta requête originale, on suppose qu'il ne peut y avoir plus d'une equipe par individu dans la table rsmind.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre éclairé Avatar de _Carole
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 105
    Par défaut
    Merci pour la réponse!
    Je trouve la manière de procéder un chouïa barbare (enfin, assez lourde) mais si c'est la seule solution, tampis

    on suppose qu'il ne peut y avoir plus d'une équipe par individu dans la table rsmind.
    C'est exact, un individu ne peut faire partie que d'une seule équipe.

    En fait, cette requête va faire partie d'une grande 'procédure' qui se fera chaque mois : on charge des fichiers csv dans les tables temporaire et on rempli la BDD grâce à un ensemble de requêtes.

    D'un fichier à l'autre, des personnes peuvent s'ajouter ou changer d'équipe. On ne conserve pas d'historique d'affectation c'est pour ça que l'update est là.

  4. #4
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut
    J'aurais tendance à utiliser une combinaison de WITH, UPDATE, RETURNING et INSERT. De cette manière...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    with v as 
    (update  personnel set personnel.c1=rsmind.c1, personnel.c2=rsmind.c2,... 
    			from rsmind   where  personnel.c1=rsmind.c1 
    			returning c1
    )
    insert into personnel(c1,c2,...) 
    	select c1,c2,... from rsmind   
    		where rsmind.c1 not in (select c1 from v)
    @+

  5. #5
    Membre éclairé Avatar de _Carole
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 105
    Par défaut
    Ah, je comprend plus facilement votre requête, alassanediakite.
    De plus, elle à l'air plus rapide en temps d'exécution. (= donc plus efficace ?!)

    Merci!

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 986
    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 986
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par alassanediakite Voir le message
    Salut
    J'aurais tendance à utiliser une combinaison de WITH, UPDATE, RETURNING et INSERT. De cette manière...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    with v as 
    (update  personnel set personnel.c1=rsmind.c1, personnel.c2=rsmind.c2,... 
    			from rsmind   where  personnel.c1=rsmind.c1 
    			returning c1
    )
    insert into personnel(c1,c2,...) 
    	select c1,c2,... from rsmind   
    		where rsmind.c1 not in (select c1 from v)
    @+
    ATTENTION, le WITH avec des requêtes de mise à jour n'existe pas dans la norme SQL.... Ceci veut dire que PG fait dans le spécifique et hors norme alors qu'il se vantait jusqu'àlors d'être purement normatif... (j'ai beaucoup critiqué cela dans les PG Days et cela m'a valu des houhou... !) Hors la norme c'est MERGE !!!

    Mais je vous ais mis un point pour cette solution car elle est intéressante, mais pas forcément meilleure...

    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/ * * * * *

  7. #7
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut
    SQLpro, pouvez-vous m'édifier un peu sur le rapport entre "hors" et "or"? Mes excuses si c'est pas le bon forum.
    J'ai, une fois, fait une remarque sur la doc de postgresql par rapport à l’appellation de l'opérateur "^". Ma remarque ressemblait une peu à...
    La doc dit "exponentiel" hors c'est plutôt "exposant".
    Mais ensuite, j'ai fait un autre email m'excusant d'avoir utiliser "hors" à la place de "or".
    Mais quand je vois
    Hors la norme c'est MERGE !!!
    j'en suis
    Au passage...
    • dans votre livre 4ème édition, à la page 231 (considération d'exploitation). Il y a confusion entre le verbe être le verbe avoir!
    • dev.com doit corriger sa doc de postgresql à propos de l'opérateur "^"

    @+

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Citation Envoyé par alassanediakite Voir le message
    pouvez-vous m'édifier un peu sur le rapport entre "hors" et "or"?
    « or » ou « hors » ?
    merci google

    Et +1 pour la pseudo syntaxe merge de postgre que je ne connaissais pas

  9. #9
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Par défaut
    Citation Envoyé par _Carole Voir le message
    Ah, je comprend plus facilement votre requête, alassanediakite.
    De plus, elle à l'air plus rapide en temps d'exécution. (= donc plus efficace ?!)

    Merci!
    Bonjour,

    Sincèrement je ne trouve pas que l'écriture de PostgreSQL pour remplacer Merge, soit plus simple... au contraire, ce n'est pas trés logique.
    Avec Oracle , on a une cible, une source, et ensuite c'est aussi simple que de dire, si ça existe tu met à jour, si ça n'existe pas tu crées, et même si ça n'existe pas dans la source tu supprimes...
    La solution avec PostgreSQL est un peu tordue...

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

Discussions similaires

  1. [PostgreSQL/CYGWIN] install de postgres sous WINdows
    Par loicmillion dans le forum Administration
    Réponses: 2
    Dernier message: 16/04/2003, 11h37
  2. [Class/PHP/Postgres] Problème de modélisation...
    Par k-reen dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 27/02/2003, 08h49
  3. pk passer de mysql à postgre
    Par pioums dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 03/10/2002, 10h31
  4. [Kylix] Requetes Kylix pour postgres
    Par Miltown dans le forum EDI
    Réponses: 1
    Dernier message: 29/05/2002, 20h22
  5. [Kylix] Kylix - Postgres
    Par Miltown dans le forum EDI
    Réponses: 1
    Dernier message: 29/05/2002, 20h19

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