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

SQL Oracle Discussion :

Comment ajouter une ligne que si elle n'existe pas en base ? MERGE INTO


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 6
    Par défaut Comment ajouter une ligne que si elle n'existe pas en base ? MERGE INTO
    Bonjour

    Je suis sous Oracle 10g.

    J'ai une table TABLE avec trois champs champs1, champs2 et champs3 Il n'y a pas de clef primaire.
    Cependant, il n'existe qu'une ligne pour champs1- champs2 .
    Par exemple si champs1 vaut 1000 et champs2 vaut 50, val3 ne pourra avoir qu'une seule valeur.

    Quand je fais la commande suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO TABLE
    VALUES (val1, val2, val3)
    Cela fonctionne très bien. (Jusque là rien d'étonnant ^^)


    Je souhaiterai faire l'insertion que si la paire val1-val2 n'est pas déjà présente en base. Dans ce cas, je ferai un update.


    J'ai fait quelque recherches et il semble que je doive passer par "MERGE INTO".

    SAUF que je n'y arrive pas. Vous pourriez m'éclairer svp ?

    J'ai testé ceci mais ça ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MERGE INTO TABLE dest
                USING( SELECT CHAMPS1, CHAMPS2, CHAMPS3 FROM TABLE) src
                    ON( dest.CHAMPS1= src.CHAMPS1) AND (dest.CHAMPS2= src.CHAMPS2) AND (dest.CHAMPS3 = src.CHAMPS3 )
                WHEN MATCHED THEN
                    UPDATE SET dest.CHAMPS3 = src.CHAMPS3 
                WHEN NOT MATCHED THEN
                    INSERT( dest.CHAMPS1, dest.CHAMPS2, dest.CHAMPS3 )
                        VALUES(src.CHAMPS1, src.CHAMPS2, src.CHAMPS3 )
    PS: je ne sais pas comment mieux intégrer le code à ce message, comment faire ?

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 962
    Par défaut
    Toute l'expression du ON doit être entre parenthèses (et vous n'avez pas besoin des parenthèses autour des AND puisque vous n'avez d'ordre de priorité d'évaluation à résoudre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ON( dest.CHAMPS1= src.CHAMPS1 AND dest.CHAMPS2= src.CHAMPS2 AND dest.CHAMPS3 = src.CHAMPS3 )

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Et surtout il ne faut pas inclure le CHAMP3 dans l'équation, sinon vous allez ajouter plein de doublons.

    Conseil 1: Ajoutez un index unique (CHAMP1, CHAMP2).
    Conseil 2: Utilisez la requête ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     merge into MaTable dst
     using StgTable src
        on (dst.CHAMPS1 = src.CHAMPS1
       and  dst.CHAMPS2 = src.CHAMPS2)
      when matched then update
       set dst.CHAMPS3  = src.CHAMPS3
     where coalesce(dst.CHAMPS3, '-tokldkfgmlsd"') <> coalesce(src.CHAMPS3, '-tokldkfgmlsd"')
      when not matched then
    insert (dst.CHAMPS1, dst.CHAMPS2, dst.CHAMPS3)
    values (src.CHAMPS1, src.CHAMPS2, src.CHAMPS3)

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 6
    Par défaut
    Merci à vous deux :-)

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

Discussions similaires

  1. Comment ajouter une ligne à un sous-formulaire?
    Par Leila59 dans le forum IHM
    Réponses: 14
    Dernier message: 17/05/2008, 14h08
  2. Comment ajouter une ligne dans une feuille ?
    Par vacknov dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 15/11/2007, 07h30
  3. Réponses: 8
    Dernier message: 26/05/2007, 17h43
  4. [C#]Comment ajouter une ligne vide a un datalist ?
    Par rfaouzi dans le forum ASP.NET
    Réponses: 4
    Dernier message: 08/11/2006, 10h34
  5. Débutant : Comment ajouter une ligne à un DataGrid sur VB ?
    Par gamool dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 23/11/2005, 23h53

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