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 d'une table à partir d'une autre


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 71
    Points
    71
    Par défaut Update d'une table à partir d'une autre
    Bonjour,

    je possède une table Table1 comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Table1
    .......
    Champ1 number(10)
    et une table Table2 comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Table2
    .......
    C1T2 number(20)
    C2T2 number(20)
    Voici quelques valeurs que l'on retrouve dans la table Table2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    C1T2                          C2T2
    0364735463                 REJRFHE-JD-4387-8
    BDGEJF-0938-JUR-D      BDGEJF-0938-JUR-D
    9487638949                JZOEDF-9D-KS-JD
    9485320458                JKSK-KS-JDS-QZE
    9584003837                EYZ-536-73-BND
    JDIRLE-74-TEUS-JE      JDIRLE-74-TEUS-JE 
    9482374053                DJEE-537-830D0N
    Si vous regardez bien vous pouvez vous apercevoir que certaines valeurs de C1T2 sont les mêmes que C2T2... L'idée serait de récupérer toutes les valeurs de C1T2, et de les insérer dans le champ Champ1 de la table Table1, mais UNQUEMENT les valeurs de C1T2 qui ne sont pas en rouge!

    Voici ce que je voudrai obtenir dans ma table Table1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Champ1
    ..........
    0364735463
    9487638949                
    9485320458                
    9584003837     
    9482374053
    Voilà alors la requête que je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into Table1(Champ1)select C1T2 from Table2 where C1T2<>C2T2
    ... mais cela ne fonctionne pas...
    J'obtiens l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ORA-12899: value too large for column USER.Table1.Champ1 (actual: 17, maximum: 10)
    J'en conclue donc que les valeurs telles que BDGEJF-0938-JUR-D sont tout de même prises en compte par ma requête... Une idée ?

    Merci beaucoup

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous pouvez rajouter une condition sur la longueur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO Table1 (Champ1)
    SELECT C1T2
      FROM Table2
     WHERE C1T2 <> C2T2
       AND length(C1T2) <= 10;
    Par contre ce sont des varchar2, pas des nombres !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 71
    Points
    71
    Par défaut
    Effectivement ce sont des varchar, je me suis trompé en recopiant
    Merci beaucoup pour votre réponse, cela fonctionne très bien maintenant
    Juste une chose... pourquoi la condition de longueur était-elle requise ? Le fait de mettre "where C1T2<>C2T2" n'était-il pas suffisant ? Je pensais que la condition était dabord évaluée, puis la valeur insérée si la condition était vraie.. ce n'est donc pas comme ça que ça se passe ?


  4. #4
    Membre averti
    Homme Profil pro
    Chef de projets Décisionnel
    Inscrit en
    Juillet 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projets Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 263
    Points : 320
    Points
    320
    Par défaut
    Hello
    Waldar t'a proposé de faire comme ça parce ta suite de code a la même longueur en fait. Donc il a raison de faire ainsi.

    Tu pourrais aussi utiliser une requete avec ta jointure classique et en + tu rajoutes un not in dans la clause where.

    C1T2<>C2T2 n'est pas suffisant, tu as des chaines de casse, type et longueur différentes.

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/06/2012, 12h12
  2. SQL Update d'une table à partir d'une autre table
    Par Jean-Marc68 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 16/03/2007, 13h22
  3. [D7],[Access], update d'une table à partir d'une autre
    Par iam dans le forum Bases de données
    Réponses: 4
    Dernier message: 06/11/2006, 18h14
  4. Update d'une table à partir d'une autre
    Par nicoaix dans le forum Access
    Réponses: 5
    Dernier message: 09/03/2006, 11h36
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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