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 :

merge et dual ?


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 292
    Par défaut merge et dual ?
    Bonjour,
    peut -on utiliser la table dual dans la clause using de l'instruction merge ? comment ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    merge into T1
    using (select 1 as cod, 'dupond' from dual) T2
    on T1.id=1 # ou T1.id=T2.cod
    ......
    j'ai essayé ces 2 truc, ça na pas marché !!
    Merci

  2. #2
    Expert confirmé 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
    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, 'TOTO' ename, 'TATA' job from dual ) s
     on (s.empno  = e.empno)
    when matched then
      update set comm = null
    when not matched then 
      insert (e.empno, e.ename, e.job) values (s.empno, s.ename, s.job)
    /

  3. #3
    Membre chevronné Avatar de delphine35
    Femme Profil pro
    Analyste BO
    Inscrit en
    Novembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste BO

    Informations forums :
    Inscription : Novembre 2009
    Messages : 265
    Par défaut
    Dual est une table "comme les autres", on peux l'utiliser sans problème dans l'instruction Merge :
    Voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    MERGE INTO Table1 T
    USING (select '1' from dual) S   
       ON (T.COL1 = '1' and T.COL2 =2)
    WHEN MATCHED THEN 
        UPDATE SET COL3=3 
    WHEN NOT MATCHED THEN 
        INSERT INTO Table1  (COL1,COL2,COL3) values ('2',3,4)

  4. #4
    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
    De ce que je vois de votre code, vous n'avez pas mis de parenthèses sur la partie ON qui effectue la jointure entre la table et le USING.
    Elles sont obligatoires.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 292
    Par défaut
    j'ai essayé les 2 solution ça na pas marché !!
    voilà ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MERGE INTO archi_table D
    USING (SELECT '001ABC' as cod, 'sad01235','14/03/08','dsz','14/03/08' FROM DUAL) S
    ON (S.cpd=D.cod)
    WHEN MATCHED THEN 
    UPDATE SET D.DATE_ARCHIVE = sysdate 
    WHEN NOT MATCHED THEN
    INSERT (D.cod, D.desig, D.DATE_TRAIT, D.ANO, D.DATE_EXPORT, D.DATE_ARCHIVE)
    VALUES ('001ABC', 'sad01235', '14/03/08', 'null', '14/03/08', sysdate)
    code erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Erreur commençant à la ligne 1 de la commande :
    Erreur à la ligne de commande : 3, colonne : 16
    Rapport d'erreur :
    Erreur SQL : ORA-00918: column ambiguously defined
    00918. 00000 -  "column ambiguously defined"
    *Cause:    
    *Action:

  6. #6
    Membre chevronné Avatar de delphine35
    Femme Profil pro
    Analyste BO
    Inscrit en
    Novembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste BO

    Informations forums :
    Inscription : Novembre 2009
    Messages : 265
    Par défaut
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MERGE INTO archi_table D
    USING (SELECT '001ABC' AS cod, 'sad01235','14/03/08','dsz','14/03/08' FROM DUAL) S
    ON (S.cpd=D.cod)
    WHEN MATCHED THEN 
    UPDATE SET D.DATE_ARCHIVE = sysdate 
    WHEN NOT MATCHED THEN
    INSERT INTO archi_table (cod, desig, DATE_TRAIT, ANO, DATE_EXPORT, DATE_ARCHIVE) 
    VALUES ('001ABC', 'sad01235', '14/03/08', 'null', '14/03/08', sysdate)

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 292
    Par défaut
    je pense pas que le pbm est dans la clause insert !!
    j'ai déjà travaillé avec merge de cette façon en utilisant des tables dans using,
    mais là avec dual ça colle pas !

  8. #8
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sELECT '001ABC' AS cod, 'sad01235','14/03/08','dsz','14/03/08' FROM DUAL
    Il faut aliaser les variables.
    Exemple de Mnitu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    merge INTO emp e
      USING (SELECT 1 empno, 'TOTO' ename, 'TATA' job FROM dual ) s
     ON (s.empno  = e.empno)
    when matched then
      UPDATE SET comm = NULL
    when NOT matched then 
      INSERT (e.empno, e.ename, e.job) VALUES (s.empno, s.ename, s.job)

  9. #9
    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
    Trois erreurs.

    La première, vous n'êtes pas rigoureux, vous aliasez dans le using :
    Mais dans votre jointure :
    La deuxième : il faut nommer toutes les colonnes de votre sous-requête, et les réutiliser dans le MERGE, le but ce n'est pas d'écrire de la constante partout mais une seule fois dans le USING.

    La dernière : vous envoyez des chaînes de caractères dans des dates, sans conversion point de salut.
    Accessoirement, voir des années écrites sur deux caractères, c'est inacceptable.

    Au final, vous auriez du écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     MERGE into archi_table d
     using (select '001ABC'                            as cod        ,
                   'sad01235'                          as desig      ,
                   to_date('14/03/2008', 'dd/mm/yyyy') as date_trait ,
                   'dsz'                               as ano        ,
                   to_date('14/03/2008', 'dd/mm/yyyy') as date_export,
                   sysdate                             as date_archive
              from dual) s
        on (s.cod = d.cod)
      WHEN MATCHED THEN
    update set d.date_archive = s.date_archive 
      WHEN NOT MATCHED THEN
    insert (d.cod, d.desig, d.date_trait, d.ano, d.date_export, d.date_archive)
    values (s.cod, s.desig, s.date_trait, s.ano, s.date_export, s.date_archive);

  10. #10
    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
    Citation Envoyé par Waldar Voir le message
    vous n'êtes pas rigoureux

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

Discussions similaires

  1. Merge fichier
    Par OuBiEn dans le forum Linux
    Réponses: 2
    Dernier message: 17/02/2005, 15h44
  2. Role de Dual??
    Par sali dans le forum Oracle
    Réponses: 3
    Dernier message: 24/11/2004, 22h33
  3. Dual Screen sur portable
    Par aliasjcdenton dans le forum Matériel
    Réponses: 4
    Dernier message: 22/08/2004, 16h09
  4. Shell - Merge de fichiers
    Par tesla dans le forum Linux
    Réponses: 4
    Dernier message: 29/06/2004, 02h10
  5. equivalent de select nextval from dual en SQL-Server ?
    Par toze dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/10/2003, 09h17

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