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

Langage SQL Discussion :

[Oracle] combiner un update et un insert


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 51
    Points : 21
    Points
    21
    Par défaut [Oracle] combiner un update et un insert
    Bonjour,

    Environnement SQLPlus d'Oracle.
    Une table 'DESTINATION'(1) est remplit avec les données de deux autres tables 'CONT1'(2), 'CONT2'(3) la clé primaire étant USER_ID dans ces 3 tables. De plus le nombre de colonne entre ces 3 tables sont totalement différents
    => (1) a 14 colonnes issus de (2) et (3)
    => (2) a 7 colonnes
    => (3) a 12 colonnes
    Cette première opération est réussie sans problème.



    je souhaite faire un update des données de (1) dans (2) pour les données existantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    UPDATE USER_TST
    SET (USER_TST.USER_ALIAS) =
    (
    SELECT USER.USER_ALIAS FROM USER 
    WHERE USER_TST.USER_ID = USER.USER_ID
    )
    WHERE (USER_TST.USER_ID) IN (SELECT USER.USER_ID FROM USER);
    => Cela marche nickel, je fait la meme chose pour la table (3)

    Voici la problématique :
    Par contre des lignes supplémentaire sont présents dans (1) et inexistant dans (2) et (3), donc l'update ne les prends pas en compte. D'où la problématique
    => comment faire, dans l'idéal en une seule opération, un update/insert qui met à jour les données existantes de (1) dans (2), (3) d'une part, puis rajoute les nouvelles lignes de (1) dans (2) et (3) d'autre part.

    ps : pour simplifier le problème on peut uniquement utiliser les tables (1) et (2).

    J'espère avoir était assez claire sur mon problème et que vous allez savoir m'aider à le résoudre.

    Merci

  2. #2
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Citation Envoyé par Pakkaï

    Cette première opération est réussie sans problème.


    Cela marche nickel, je fait la meme chose pour la table (3)
    Bravo

    Mais je crois que tous les sports ont leur limite et c'est rarement celle de l'homme mais des règles ou de l'engin utilisés.

    Hélas malheureusement tu atteinds les limites du SQL où le S signifie réellement SIMPLE. (en tous les cas de limite tu atteinds les miennes).

    De plus je comprends bien que c'est pour le sport mais en terme de perf il faut aussi savoir s'arrêter, les temps de transmission ont bien évolués, et il est souvent, sinon plus sage, bien meilleur de faire deux requêtes.

    a+ et bonne chance je suivrai avec intérêt tous les grands sportifs ou sportives qui voudront bien te répondre.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 51
    Points : 21
    Points
    21
    Par défaut Et pourtant...
    Salut,

    Merci pour ta réponse... et pourtant il existe bel et bien une solution à ce problème, que j'ai trouvé grace à la fonction Merge d'Oracle, quelle puissance cet Oracle

    Voici un exemple pour que vous puissiez comprendre le fonctionnement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    MERGE INTO nom de la table de destination n
    USING (SELECT les colonnes nécessaires from la table) e
    ON ( n.ID = e.ID )
    WHEN MATCHED THEN UPDATE 
        SET n.ALIAS = e.ALIAS -- les colonnes ayant besoin d'être mis à jour, sauf l'ID qui est la condition et la clé primaire
    WHEN NOT MATCHED THEN 
    INSERT (n.ID, n.ALIAS)
    values ( e.ID,
             e.ALIAS );
    Plus d'info (en anglais) je vous conseil :
    * http://asktom.oracle.com/pls/ask/f?p...:5318183934935
    * http://download-west.oracle.com/docs...htm#SQLRF01606

    voilà comment faire un update/insert en meme temps sous Oracle. Béni soit Oracle lol

    Bonne continuation

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 102
    Points : 28 399
    Points
    28 399
    Par défaut
    C'est une réponse spécifique Oracle, pas conforme au standard SQL

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

Discussions similaires

  1. Problème d'Update et D'Insert
    Par domux dans le forum JDBC
    Réponses: 6
    Dernier message: 10/07/2006, 11h31
  2. [Oracle] Killer un update en cours
    Par venegan dans le forum Oracle
    Réponses: 12
    Dernier message: 13/04/2006, 09h51
  3. Impossibilité de faire un update ou un insert
    Par nazimb dans le forum ASP.NET
    Réponses: 13
    Dernier message: 09/03/2006, 17h27
  4. Réponses: 4
    Dernier message: 27/01/2006, 15h58
  5. [C#] [Oracle] Problème d'Update
    Par _Air_ dans le forum Windows Forms
    Réponses: 12
    Dernier message: 06/04/2005, 13h56

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