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 :

Update sans insert


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut Update sans insert
    Bonjour à tous,

    RDBMS : 9.2.0.7

    j'ai l'habitude de faire des merges avec plusieurs tables, cette commande jusqu'à présent ne m'avait posé aucun soucis.

    je dois réaliser un MERGE sur une simple table, et là je tombe 'des nues', l'update de mon ordre merge fonctionne, pas l'ordre insert.

    un bout de code de test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    MERGE INTO V_INDICATEURS I1
                               USING (SELECT INDIC_SEQ
                                      FROM V_INDICATEURS 
                                      WHERE TRAI_ID='P_05M55.1_T1') I2 
                               ON (I1.INDIC_SEQ=I2.INDIC_SEQ)        
                               WHEN MATCHED THEN UPDATE SET INDIC_NBREP=100                               
                               WHEN NOT MATCHED THEN INSERT(INDIC_SEQ,    
                                                            TRAI_ID,        
                                                            INDIC_NBREP) 
                                                     VALUES(INDIC_SEQ.NEXTVAL, 'P_05M55.1_T1', 100)
    j'ai beau voir et revoir cette requête, je ne trouve pas la solution ?
    Est ce une limite de la commande MERGE en 9i lorsque l'interrogation sub_query se référe à la même table ?

    des idées en ce vendredi dur dur

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Désolé, mais j'ai un peu du mal à comprendre: comment veut tu obtenir le NOT MATCHED dans ce cas ?

  3. #3
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Désolé, mais j'ai un peu du mal à comprendre: comment veut tu obtenir le NOT MATCHED dans ce cas ?
    tout d'abord merci de bien vouloir m'aider
    j'ai adapté cette requete en reprenant des scripts que j'avais déjà qui réaliser des MERGE avec plusieurs tables dans la sub_query et qui dans la clause ON faisait uniquement une jointure sur la pk entre ma table à merger et la column de ma sub_query correspondante;

    j'ai tout simplement adapté ce que j'avais déjà fait. la seule particularité est que je veux le faire sur une seule table.

    Ce que je souhaite faire :
    si le traitement (TRAI_ID) est trouvé dans la table V_INDICATEURS, je mets à jour les valeurs correspondantes sinon je crée une nouvelle ligne
    pour obtenir un code le plus maintenable possible le MERGE me parait comme une évidence.

    Cette autre requete fonctionne désormais pour l'insert, mais plus pour l'update
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    MERGE INTO V_INDICATEURS I1
                               USING (SELECT TRAI_ID
                                      FROM V_INDICATEURS 
                                      ) I2 
                               ON (I2.TRAI_ID='P_05M55.1_T1')        
                               WHEN MATCHED THEN UPDATE SET I1.INDIC_NBREP=100                             
                               WHEN NOT MATCHED THEN INSERT(INDIC_SEQ,    
                                                            TRAI_ID,        
                                                            INDIC_NBREP) 
                                                     VALUES(INDIC_SEQ.NEXTVAL, 'P_05M55.1_T1', 100)
    comment ferais tu à partir des requetes que j'ai fourni ?
    car là je séche !

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Merge Into emp e USING
      (Select 1 empno, 'MNI' ename, 'DEV' job, Null mgr, sysdate hiredate, 3000 sal, Null comm, 10 deptno
         From dual
       ) t
     on (e.empno = t.empno)
    When MATCHED Then update set e.sal = e.sal + 100
    When Not Matched Then 
         Insert values(t.empno, t.ename, t.job, t.mgr, t.hiredate, t.sal, t.comm, t.deptno)

  5. #5
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    je connais la syntaxe quand la sub_query fait référence à une autre table comme toi ici avec la table dual.
    je l'ai déjà mis en oeuvre sans pbs

    ma question porte sur le fait de pouvoir référencer la même table dans la clause USING

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 77
    Points : 84
    Points
    84
    Par défaut
    Je pense que la principale question de mnitu (en tout cas la mienne) est comment fais-tu le lien entre I1 et I2?

    si le traitement (TRAI_ID) est trouvé dans la table V_INDICATEURS, je mets à jour les valeurs correspondantes sinon je crée une nouvelle ligne
    Tu te bases sur quoi pour définir les valeurs correspondantes? Ca doit être cette partie qui manque dans ton query au niveau du "ON"

  7. #7
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par dragon74 Voir le message
    Je pense que la principale question de mnitu (en tout cas la mienne) est comment fais-tu le lien entre I1 et I2?

    Tu te bases sur quoi pour définir les valeurs correspondantes? Ca doit être cette partie qui manque dans ton query au niveau du "ON"
    bonsoir à toi, et merci de ta contribution
    I1 et I2 sont ici 2 alias qui font référence à la même table.

    au niveau logique c'est la première requete que j'ai fourni qui répond à ta question

    MERGE INTO V_INDICATEURS I1
    USING (SELECT INDIC_SEQ
    FROM V_INDICATEURS
    WHERE TRAI_ID='P_05M55.1_T1') I2
    ON (I1.INDIC_SEQ=I2.INDIC_SEQ)

    j'interroge la table V_INDICATEURS aliaser ici I2 pour rechercher la PK (INDIC_SEQ) associée au traitement ici dans la clause WHERE

    dans la clause ON c'est bien sur cette clé que je cherche à déclencher le MERGE (le pb que je mets en évidence dans ce post, c'est que je veux le faire sur la même table)
    ici l'update fonctionne sans pb pas l'insert

    je comprends bien le fonctionnement du MERGE quand il s'agit d'avoir dans la clause USING une autre table.

    c'est pq en effet, je comprends bien qu'ici le NOT MATCHED ne se déclenche pas dans la logique de fonctionnement de cette commande

    je cherche à savoir si ce que je cherche à faire va être possible avec cette commande ou non

    merci encore

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Que souhaitez-vous faire alors ?

    Effectivement, merge une table depuis elle même ne peut forcément qu'aboutir à un update, à moins de créer des données.

  9. #9
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Que souhaitez-vous faire alors ?

    Effectivement, merge une table depuis elle même ne peut forcément qu'aboutir à un update, à moins de créer des données.
    je voulais simplement éviter de devoir faire cela en pl, et par curiosité je cherchai une alternative en pur SQL et je me suis pour cela un peu entêter avec le MERGE

    je viens de terminer ma procédure en PL, c'était en effet pas la mort à coder : 20 min à tout casser

    je cloture le post.

    merci à tous de vos contributions

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

Discussions similaires

  1. Insert or Update sans table de référence
    Par LDPDC dans le forum SQL
    Réponses: 4
    Dernier message: 25/05/2009, 14h47
  2. update or insert
    Par jarod_bx dans le forum Access
    Réponses: 3
    Dernier message: 09/01/2006, 19h03
  3. sql update et insert dans la meme requete
    Par Jessicaa dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/12/2005, 15h39
  4. Réponses: 8
    Dernier message: 22/06/2005, 10h34
  5. Update ou insert avec incrément d'un champ
    Par dany13 dans le forum ASP
    Réponses: 5
    Dernier message: 15/10/2004, 12h53

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