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 :

Jointure sur 2 critères


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2009
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 346
    Par défaut Jointure sur 2 critères
    Bonjour les SQLeux,

    J'ai une première requête T1 qui donne :

    VILLE NOM NB1

    LILLE MAX 18
    LILLE FRED 24
    CAEN MAX 16
    CAEN ERIC 17
    CAEN PAUL 41
    CAEN FRED 17


    Et une seconde T2 qui donne :


    VILLE NOM NB2

    LILLE MAX 8
    LILLE FRED 2
    CAEN MAX 12
    CAEN PAUL 4


    Je voudrais obtenir la table suivante :


    VILLE NOM NB1 NB2

    LILLE MAX 18 8
    LILLE FRED 24 2
    CAEN MAX 16 12
    CAEN ERIC 17 0
    CAEN PAUL 41 4
    CAEN FRED 17 0

    Il faudrait donc faire une jointure sur 2 critères : La ville et le Nom car une même personne peut être sur 2 villes... et comme vous le voyez ma table T2 n'a pas autant de lignes que T1.

    Voici ce que j'ai tenté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT VILLE,NOM,NB1,NB2
    FROM T1 FULL OUTER JOIN T2
    ON T1.VILLE=T2.VILLE
    AND T1.NOM=T2.NOM
    Celà dit cela ne semble pas fonctionner. Et si j'enlève un critère de jointure évidemment le résultat n'est pas correct puisqu'il y a des doublons dans les villes et dans les noms.

    Quelqu'un pourrait-il éclairer ma lanterne ?

    Merci d'avance.

    Eric.

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    cela ne semble pas fonctionner
    Symptômes ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2009
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 346
    Par défaut Symptôme du "ca marche pas"
    Hello, en fait je n'ai pas de message d'erreur sur mon bazar, c'est juste que ca tourne dans le vide (pendant TREEEEEEES longtemps).

    Je pense que le problème vient du fait qu'il n'arrive pas à faire une jointure lorsqu'il y a une ligne dans T1 qu'il n'y a pas dans T2.

    Pourtant c'est le même principe qu'un full outer join normal ou il sort des NULL à droite s'il ne trouve pas de correspondance...

    Mais là il y a 2 critères alors il ne veut pas

    Peut-être faut-il mettre autre chose que full outer join...

    Je suis un peu coincé j'ai pourtant cherché plus de 5h avant de venir pleurnicher sur le forum.

    A+

    Eric.

  4. #4
    Membre éclairé
    Inscrit en
    Juin 2009
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 346
    Par défaut
    Précision, lorsqu'au lieu de full outer join j'ai mis un right outer join (ou le left j'ai un doute) il m'a retourné :

    LILLE MAX 18 8
    LILLE FRED 24 2
    CAEN MAX 16 12
    CAEN PAUL 41 4

    Il m'a donc manqué les lignes avec les zéros (ou les NULL peu importe)

    Si cette précision peut être utile...

    Eric.

  5. #5
    Membre éclairé Avatar de Jihnn
    Inscrit en
    Décembre 2005
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 330
    Par défaut
    C'est bien une jointure FULL OUTER JOIN que vous recherchez. Normalement, votre SGBDR devrait renvoyer NULL lorsqu'une ligne n'a pas de correspondance dans une autre.

    Le seul problème que je vois dans votre requête, c'est que vos colonnes VILLE et NOM sont ambigües. Vous devriez écrire devant le nom de la table (T1.VILLE, T1.NOM...).

    Pour avoir la valeur 0 plutôt que NULL, vous pouvez utiliser la fonction COALESCE().

    Si j'utilise la même structure de vos tables, cette requête renvoie ce que vous recherchez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T1.VILLE, T1.NOM, COALESCE(NB1, 0), COALESCE(NB2, 0)
    FROM T1                   
    FULL OUTER JOIN T2
        ON T1.NOM = T2.NOM AND T1.VILLE = T2.VILLE;

  6. #6
    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
    Plutôt comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT COALESCE(T1.VILLE, T2.VILLE) AS VILLE,
           COALESCE(T1.NOM  , T2.NOM  ) AS NOM  ,
           COALESCE(T1.NB1  , 0       ) AS NB1  ,
           COALESCE(T2.NB2  , 0       ) AS NB2
      FROM T1                   
           FULL OUTER JOIN T2
             ON T2.NOM   = T1.NOM
            AND T2.VILLE = T1.VILLE;

  7. #7
    Membre éclairé Avatar de Jihnn
    Inscrit en
    Décembre 2005
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 330
    Par défaut
    Il semblerait qu'on ne puisse pas avoir de valeurs nulles pour NOM et VILLE. Si c'était le cas, la jointure ne pourrait pas fonctionner correctement, non ?

    Sinon, comment pourrait-on savoir à quelle ville quelqu'un appartient (ou quel est le nom qui vit dans telle ville) ?

Discussions similaires

  1. Jointure externe sur "plusieurs critères" et COUNT
    Par Theophane631 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 12/08/2013, 18h51
  2. soucis de jointure sur plusieurs critères "left join ON . AND ON ."
    Par Moutonstar dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/11/2008, 17h22
  3. jointure sur une même table
    Par guillaumeVb6 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/09/2004, 15h08
  4. jointure sur TROIS tables
    Par caribou_belle dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/03/2004, 11h20
  5. Jointure sur 2 tables de bases différentes
    Par Celina dans le forum Langage SQL
    Réponses: 10
    Dernier message: 10/11/2003, 11h56

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