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 mais avec une seule table : possible?


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 18
    Points
    18
    Par défaut Merge mais avec une seule table : possible?
    Bonjour à tous,

    J'ai une tache assez simple à faire, mais je ne vois pas quel est le moyen le plus simple et efficace d'y arriver.

    C'est tout simple :

    - J'ai une table T1 sur laquelle je fais des UPDATE en fonction d'un ID.
    - Sauf que cette table ne contient pas forcément de ligne avec L'ID correspondant.
    - Si la ligne n'existe pas, je voudrais faire plutôt un INSERT.

    - Tout cela sans utiliser de procédure stockée. Uniquement en une requête SQL

    Je suis sous Oracle 9i release 2

    Et j'ai trouvé une fonction qui pourrait faire l'affaire : MERGE, dont la syntaxe est la suivante :

    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
     
    MERGE INTO <table/view>
    USING <table/view/subquery> ON (condition)
     
    --update
     
    WHEN MATCHED THEN
    UPDATE SET column = (value/expr),..
    WHERE (condition) | DELETE WHERE (condition)
     
    --insert
     
    WHEN NOT MATCHED THEN
    INSERT (column,..) VALUES (value/expr,..)
    WHERE (condition)
     
    --error log
    Mon souci est que cette fonction prend en compte 2 tables, et fait une comparaison entre les deux, dans le but de faire une sorte de synchro entre les deux.

    Mais dans mon cas je n'ai qu'une seule table, sur laquelle je voudrais faire :

    if(select ID FROM T1) then
    UPDATE
    else
    INSERT
    end if

    Mais sans procédure stockée...

    Est ce possible ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    un test rapide te le confirmera

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    En fait j'ai pensé à faire un test, mais je ne vois pas très bien quoi écrire.

    Un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    MERGE INTO T1
    USING (SELECT id FROM T1) ON (T1.id=ID)
     
    WHEN MATCHED THEN
    UPDATE T1 SET COLUMN = value WHERE id=ID
     
    WHEN NOT MATCHED THEN
    INSERT INTO T1 (COLUMN) VALUES (value)
    ?

    Merci

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    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
    28
    SQL>create table t1 (id number);
     
    Table created.
     
    SQL>insert into t1 values (1);
     
    1 row created.
     
    SQL>commit;
     
    Commit complete.
     
    SQL> MERGE INTO T1
      2   USING (SELECT ID FROM T1) t ON (t.ID=0)
      3   WHEN MATCHED THEN
      4   UPDATE SET ID = 1 WHERE id=ID
      5   WHEN NOT MATCHED THEN
      6   INSERT (ID) VALUES (1);
     
    1 row merged.
     
    SQL>/
     
    2 rows merged.
     
    SQL>/
     
    4 rows merged.

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    C'est très sympa de m'aider...mais ça marche pas

    Je ne sais pas pourquoi je n'arrive pas à comprendre la logique de cette instruction MERGE.

    voila ma syntaxe dans un cas concret :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MERGE INTO REGARD_INVENTAIRE
    USING (SELECT ID_REGARD FROM REGARD_INVENTAIRE WHERE ID_REGARD=200) t ON (t.ID_REGARD=200)
    WHEN MATCHED THEN
    UPDATE SET NB_TAMPON = 3
    WHEN NOT MATCHED THEN
    INSERT (ID_REGARD, NB_TAMPON) VALUES (200,3)
    Pas d'erreur renvoyée, mais pas d'insertion non plus. (ID_REGARD=200 n'existe pas).

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    ID_REGARD n'existant pas la requête ne retourne rien donc le MERGE ne fait rien. Le MATCH s'applique aux lignes retournées par la requête.

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Excuse moi, je suis peut être hyper con, mais je ne comprends pas du tout le truc...mais alors pas du tout...et je suis dessus depuis deux jours !

    Si je comprends bien ta dernière réponse, je me dis que du coup ce n'est pas MERGE qu'il me faut...puisque justement je veux faire un INSERT quand la requête SELECT ne renvoie rien.

    Et toi tu me dis, si la requête ne renvoie rien, MERGE ne fait rien. ????

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Et quand j'ecris ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    MERGE INTO REGARD_INVENTAIRE
    USING (SELECT ID_REGARD FROM REGARD_INVENTAIRE) t ON (t.ID_REGARD=200)
    WHEN MATCHED THEN
    UPDATE SET NB_TAMPON = 3
    WHEN NOT MATCHED THEN
    INSERT (ID_REGARD, NB_TAMPON) VALUES (200,3)
    c'est à dire sans le WHERE ID_REGARD=200 dans le SELECT...et bein j'ai une erreur :

    ORA-00001: violation de contrainte unique (SDE.I243ID_REGARD)

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    Help svp...je sais que je ne suis pas loin...il manque un tout petit truc c'est sûr..Mais je ne sais pas quoi

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 46
    Points : 18
    Points
    18
    Par défaut
    euuh...je retente un petit appel

    quelqu'un aurait une idée pour l'utilisation de cette fonction MERGE sur une seule table... ?

    Merci

  11. #11
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Je pense qu'il y a un souci dans le code d'Orafrance.
    Il manque pas un alias ?
    Citation Envoyé par orafrance Voir le message
    [CODE]SQL>create table t1 (id number);

    SQL> MERGE INTO T1
    2 USING (SELECT ID FROM T1) t ON (t.ID=0)
    3 WHEN MATCHED THEN
    4 UPDATE SET ID = 1 WHERE id=ID
    5 WHEN NOT MATCHED THEN
    6 INSERT (ID) VALUES (1);
    /CODE]
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. Gestion des libellés avec une seule table
    Par scharly3 dans le forum Microsoft BI
    Réponses: 7
    Dernier message: 02/03/2012, 22h41
  2. B.D avec une seule table
    Par infose dans le forum Développement
    Réponses: 7
    Dernier message: 04/11/2010, 10h58
  3. [Doctrine] plusieurs many-to-many avec une seule table
    Par Lideln75 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/10/2010, 11h54
  4. [SSAS] Cube avec une seule table
    Par Safaritn dans le forum SSAS
    Réponses: 3
    Dernier message: 01/08/2008, 15h05
  5. [FN]Faire 1 BD avec une seule table ou normaliser ?
    Par borndead dans le forum Schéma
    Réponses: 7
    Dernier message: 12/06/2007, 15h26

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