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 :

Problème avec INNER JOIN


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 23
    Points : 16
    Points
    16
    Par défaut Problème avec INNER JOIN
    Bonjour,

    J'ai une table Annonces:
    ann_id
    ann_Nom
    ...
    ann_Categories
    ann_Categories1
    ann_Categories2

    et une table Categories:
    Cat_Id
    Cat_Nom

    J'arrive à joindre les 2 tables de cette manière.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT * FROM [Annonces] INNER JOIN Categories 
    ON Annonces.Ann_Categories = Categories.Cat_Id WHERE (Ann_Id = @Ann_Id)
    malheureusement je n'arrive pas à joindre les 3 champs de la tables Annonces
    ann_Categories
    ann_Categories1
    ann_Categories2

    aux champs Categories.Cat_Id de la table Categories.

    J'ai essayé cela mais sans succés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT * FROM [Annonces] 
    INNER JOIN Categories 
    ON Annonces.Ann_Categories = Categories.Cat_Id
    ON Annonces.Ann_Categories1 = Categories.Cat_Id
    ON Annonces.Ann_Categories2 = Categories.Cat_Id
    WHERE (Ann_Id = @Ann_Id)
    Si quelqu'un a une idée...
    MERCI

  2. #2
    Membre confirmé Avatar de elbj
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Services à domicile

    Informations forums :
    Inscription : Novembre 2004
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Bonjour

    Ta modélisation ne semble pas correcte. Au lieu d'avoir des colones Categories dans ta table Annonces tu devrais avoir une relation entre elle et la table Catégories.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    T_Annonces
    ANN_ID
    ANN_Nom
    ...
     
    T_Categories
    CAT_ID
    CAT_Nom
    ...
     
    T_CategoriesAnnonces
    ANN_ID
    CAT_ID
    De cette manière tu pourras faire ton INNER JOIN ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ANN.ANN_Nom, CAT.CAT_Nom
    FROM T_Annonces ANN
    JOIN T_CategoriesAnnonces CAN
      ON CAN.ANN_ID = ANN.ANN_ID
    JOIN T_Categories CAT
      ON CAT.CAT_ID = CAN.CAT_ID
    Cette architecture permet d'avoir un nombre de catégories variable en fonction de l'annonce.

    Par la suite tu vas certainement me demander comment représenter tout ça sous la forme d'un tableau du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ANNONCE - CATEGORIE - CATEGORIE - CATEGORIE - ...
    --------------------------------------------------
      Nom     |    Nom        |    Nom        |    Nom
    C'est de la cosmetique et ce sera à ton appli cliente de se débrouiller pour représenter les données ainsi, ce n'est pas au SGBD de le faire.

    Cordialement
    Christophe B.

  3. #3
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Sans reprendre les considérations de modélisation de elbj, voici une réécriture correcte de ta clause JOIN, puisqu'il s'agit (à ce que j'ai compris) de 3 jointures distinctes sur la même table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INNER JOIN Categories C
    ON Annonces.Ann_Categories = Categories.Cat_Id
    INNER JOIN Categories C1
    ON Annonces.Ann_Categories1 = Categories.Cat_Id
    INNER JOIN Categories C2
    ON Annonces.Ann_Categories2 = Categories.Cat_Id
    étant bien entendu que cette requête va te ramener les champs de Annonces où les trois champs catégorie correspondent à une ou des valeurs dans Categories (et bien sûr remplissant la condition Where. Est-ce bien ce que tu veux ?
    Roland

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Salut !

    rsc c'est exactement ce que je veux faire.
    J'ai essayé ton code mais cela ne fonctionne pas.
    Voici mon code inspiré du tien et le message d'erreur que cela me renvoi.

    Merci à vous deux de votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * FROM [Annonces] 
    INNER JOIN Categories C ON Annonces.Ann_Categories = Categories.Cat_Id
    INNER JOIN Categories C1 ON Annonces.Ann_Categories1 = Categories.Cat_Id 
    INNER JOIN Categories C2 ON Annonces.Ann_Categories2 = Categories.Cat_Id 
    WHERE (Ann_Id = @Ann_Id)

    Voici l'erreur renvoyé lors de la tentative :
    The multi-part identifier "Categories.Cat_Id" could not be bound.

  5. #5
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * FROM [Annonces] 
    INNER JOIN Categories C ON Annonces.Ann_Categories = C.Cat_Id
    INNER JOIN Categories C1 ON Annonces.Ann_Categories1 = C1.Cat_Id 
    INNER JOIN Categories C2 ON Annonces.Ann_Categories2 = C2.Cat_Id 
    WHERE (Annonces.Ann_Id = @Ann_Id)
    Roland

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    rsc

    Plus de message d'erreur, mais l'annonce n'est pas renvoyée.

  7. #7
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Combien de lignes devraient t'être renvoyées, une, quelques-unes, beaucoup ?
    A mon avis, le pb doit venir de tes données.

    Quelques pistes pour cerner le problème :
    - tu supprimes la clause WHERE, et tu regardes ce qui sort
    - tu supprimes toutes les jointures...
    - tu ne gardes qu'une jointure ou deux jointures (à tour de rôle), et tu regardes les valeurs des autres colonnes Catégorie...

    Tu devrais arriver à trouver le pb.
    Roland

  8. #8
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Tu peux essayer aussi, pour tester, remplacer les INNER par des LEFT, c'est-à-dire utiliser des jointures externes.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    en effet tout fonctionne parfaitement avec LEFT.

    Merci à vous tous.

  10. #10
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    C'est parfait. Juste à titre d'explication, je te rappelle ma remarque :
    Citation Envoyé par rsc Voir le message
    étant bien entendu que cette requête va te ramener les champs de Annonces où les trois champs catégorie correspondent à une ou des valeurs dans Categories (et bien sûr remplissant la condition Where. Est-ce bien ce que tu veux ?
    Pour qu'une ligne soit renvoyée par une jointure interne, il faut qu'elle trouve dans la table jointe la valeur correspondant à la valeur de jointure de la table maître. Dans ta triple jointure, il suffit donc qu'une des trois colonnes ne soit pas renseignée ou n'ait pas de correspondance dans la table jointe pour que ta ligne ne soit pas retournée, ce qui limite l'intérêt.
    C'est là que le modèle proposé par elbj a son intérêt (et ce n'est pas le seul), car il suffit qu'une des valeurs soit renseignée pour que la jointure (interne) la retourne.
    Roland

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

Discussions similaires

  1. problème avec inner join
    Par minooo dans le forum Oracle
    Réponses: 2
    Dernier message: 20/12/2010, 22h08
  2. Problème avec Inner Join
    Par angelevil dans le forum VB.NET
    Réponses: 4
    Dernier message: 10/06/2009, 16h01
  3. [MySQL] Problème avec INNER JOIN
    Par Tee shot dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 13/02/2008, 14h28
  4. Problème de jointure avec INNER JOIN et LEFT OUTER JOIN
    Par tonio-lille dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/02/2006, 12h45
  5. [Oracle] problème avec INNER JOIN
    Par Philofish dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/09/2005, 10h20

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