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 :

Jointure dans un case..


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 Jointure dans un case..
    Bonjour,

    je possède une table T1(idT1(pk),champ2T1,champ3T1)
    Voici un exemple de son contenu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1, 0, 0
    2, 564, 24
    3, 0, 0
    et une table T2(idT2(pk),champ2T2,champ3T2,champ4T2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1, , , ,
    2, , , ,
    3, , , ,

    Les champs idT2 et idT1 sont identiques.
    Les champs "champ2T2" et "champ3T2" et "champ4T2" de la table T2 sont vides.

    L'idée serait de remplir ces champs en fonction des valeurs de champ2T1 et champ3T1 (donc de la table T1). Je voudrais obtenir quelque chose dans le style "si champ2T1+champ3T1 de T1 = 0, alors on écrit 'bonjour' dans "champ2T2" de T2". Soit ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1, 'bonjour', , ,
    2, , ,
    3, 'bonjour', , ,


    Pour celà il faut très certainement effectuer une jointure entre la table T2 et T1, mais je ne vois pas comment faire ici.
    Voyez ce que je souhaiterai faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    UPDATE T2
    SET champ2T2=
    CASE
    WHEN T1.champ2T1+T1.champ3T1=0 INNER JOIN T2 ON T1.idT1=T2.idT2
    THEN 'bonjour'
    .
    .
    . etc..
    END;

    Bien entendu je pourrais très bien copier les champ2T1 et champ3T1 de ma table T1 dans la table T2, et effectuer directement les traitements vu que toutes les valeurs seraient maintenant dans T2, mais je ne pense pas que ça soit très propre (la table T1 contient plusieurs millions d'enregistrements, je me retrouverai avec autant de données dans T2, ce qui serait certainement lourd )..
    Merci beaucoup

    EDIT : Je viens de tester cette méthode, mais j'obtiens "erreur à la ligne 1, ORA-01722: invalid number"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO T2(champ2T2,champ3T2)
    SELECT (CASE WHEN champ2T1+champ3T1=0 THEN 'Bonjour' END)as champ_calculé,
    champ3T1
    FROM T1;
    Donc ici ça devrait me calculer champ2T1+champ3T1 et me mettre le résultat ('bonjour') dans un champ_calculé (donc le champ2T2 de T2), puis me mettre le champ3T1 de T1 tel quel dans le champ3T2 de T2.

    Mais rien n'y fait
    Merci à vous

  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
    Votre question est confuse. Ajoutez un jeu d’essai de 2 ou 3 enregistrements dans chaque table ainsi que le résultat attendu.

  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
    Citation Envoyé par mnitu Voir le message
    Votre question est confuse. Ajoutez un jeu d’essai de 2 ou 3 enregistrements dans chaque table ainsi que le résultat attendu.
    Effectivement ce n'était pas très clair, j'ai indiqué un exemple de ce qu'on pourrait trouver dans T1 et T2, et le résultat que je souhaiterai obtenir (en réalité je ne souhaite pas du tout obtenir 'bonjour' dans T2, car mon résultat sera plutôt une suite de calcul. Mais si je comprend comment faire ceci, alors mon problème sera résolu ).
    Merci d'avoir pris du temps pour lire en tout cas

  4. #4
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 56
    Points : 44
    Points
    44
    Par défaut
    Bonjour,
    Ganguill,c'est vraiment un peu lourd ton exemple,essaie de rajouter quelques valeurs pour qu'on voit mieux comme l'a préconisé mnitu.
    Néanmoins, je ne trouve pas d'erreur apparente dans le bout de code que tu as envoyé. On attend la suite.
    Merci

  5. #5
    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
    Avec cet exemple je pense que la solution suivante devrait convenir.
    Prenez l'habitude de fournir un jeu de test complet, comme ceci :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    create table T1
    (
        c1 number(1) primary key, 
        c2 number(1),
        c3 number(1)
    );
     
     
    create table T2
    (
        c1 number(1) primary key, 
        c2 varchar2(10),
        c3 varchar2(10),
        c4 varchar2(10)
    );
     
     
    insert into T1 (c1, c2, c3) values (1, 0, 0);
    insert into T1 (c1, c2, c3) values (2, 5, 2);
    insert into T1 (c1, c2, c3) values (3, 0, 0);
     
    insert into T2 (c1) values (1);
    insert into T2 (c1) values (2);
    insert into T2 (c1) values (3);
     
    commit;
     
    select * from t1;
     
    C1	C2	C3
    1	0	0
    2	5	2
    3	0	0
     
    select * from t2;
     
    C1	C2	C3	C4
    1			
    2			
    3
    La mise à jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    update t2
       set c2 = 'bonjour'
     where exists (select null from t1
                   where t1.c1 = t2.c1
                   and t1.c2 = 0
                   and t1.c3 = 0);
    -- 2 rows updated
     
    select * from t2;
     
    C1	C2	C3	C4
    1	bonjour		
    2			
    3	bonjour

  6. #6
    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
    Merci Waldar c'est exactement ce que je cherchais

    Merci à tous des conseils, je choisirai des noms de champs plus clairs la prochaine fois (C1 et C2 c'est tellement plus clair que "champ1T1" ou "champ2T2" ).
    Idem pour les exemples, je fournirai quelque chose de plus complet
    Merci à tous

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

Discussions similaires

  1. Tableaux-->faire un roll-over dans une case
    Par gwendy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 23/12/2005, 12h04
  2. Affichage différent selon texte dans une case
    Par pingoo78 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/11/2005, 16h32
  3. Plusieurs jointures dans une requête sql
    Par Pero dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/09/2005, 20h59
  4. INNER JOIN ... ON ... ou jointure dans clause where
    Par schmur1 dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 28/06/2005, 09h16
  5. Optimiser les jointures dans des requêtes
    Par klereth dans le forum PostgreSQL
    Réponses: 12
    Dernier message: 23/04/2005, 17h29

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