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 :

Jointures externes compliquées.


Sujet :

Langage SQL

  1. #1
    Membre régulier Avatar de Fredo02
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 146
    Points : 91
    Points
    91
    Par défaut Jointures externes compliquées.
    bonjour,
    je tente de faire une requête sql mais sans succès.

    voici le schéma

    PERSONNE (#ID,Nom,Prenom)
    TABLE(#ID,Titre,#PERSONNE)
    PARTIE(#ID,Date,PERSONNE#,TABLE#)
    CARTE (#ID,Titre,PARTIE#)

    Une personne s'inscrit a des tables. (ses tables)
    je voudrais avoir pour la personne ayant l'id 100 et pour l'année 2010 le tableau suivant :

    TABLE : (nombre de carte tiré a la table)

    TableA : 5
    TableB : 10
    TableC : 0
    TableD : 15

    je veux que toutes les tables de la personne apparaissent même si la personne n'a pas joué a cette table durant l'année.
    J'ai fais ça mais ça ne marche pas, les conditions du and ne sont pas prises en compte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT TABLE.titre as cle,COUNT(carte.id) AS valeur 
    FROM TABLE
    LEFT OUTER JOIN PARTIE ON PARTIE.TABLE = TABLE.ID
    LEFT OUTER JOIN CARTE ON CARTE.PARTIE = PARTIE.ID
    and YEAR(PARTIE.DATE) = '2010'
    and partie.membre = '100'
    group by 1
    pour info, c'est soit j'ai toutes les tables de tout le monde soit seulement celles où il y a des carte tirées.

    Merci de m'aider SVP

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    les conditions du and ne sont pas prises en compte
    Il manque un WHERE dans cette requête, non?

  3. #3
    Membre régulier Avatar de Fredo02
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    J'ai deja essayé de mettre un where a la place du premier and mais la requete renvoi rien du tout.

    Trop bizarre !

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    La table TABLE a une colonne PERSONNE, elle correspond à quoi?

  5. #5
    Membre régulier Avatar de Fredo02
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    La clé étrangere de personne

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Certes mais on pourrait donc penser que les tables de la personne s'obtiennent en considérant cette colonne PERSONNE de la table TABLE mais la requête montrée ne lit pas cette colonne. Pourquoi?
    D'après le schéma, il y a aussi une seule personne par partie. C'est un jeu de cartes qui se joue tout seul?

  7. #7
    Membre régulier Avatar de Fredo02
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    Le schéma n'est pas représentatif de mon vrai soucis. C'est le scénario que j'ai trouvé pour résumé la problématique. Sinon oui il joue tout seul dans cette exemple. Une idée pour le problème ?

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    L'exigence :
    je veux que toutes les tables de la personne apparaissent
    La condition dans la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND partie.membre = '100'
    Il vaudrait mieux tester les personnes des tables non ?

    Maintenant quelques petites choses sur cette requête...
    1) Appeler une colonne 'TABLE' ou 'DATE' est une mauvaise idée car ce sont des mots réservés du langage SQL.

    2) Préférer le nommage des colonnes dans le GROUP BY plutôt que le numérotage. Si vous changez l'ordre des colonnes dans la requêtes, vous n'aurez plus le même résultat en les numérotant. Même si dans ce cas précis il n'y a pas d'ambiguïté.

    3) Les valeurs numériques s'écrivent sans apostrophes.

    La requête à essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT t.titre AS cle, COUNT(c.id) AS valeur
    FROM TABLE as t
    LEFT OUTER JOIN PARTIE AS p ON p.TABLE = t.ID
      AND YEAR(p.DATE) = 2010
      LEFT OUTER JOIN CARTE as C ON c.PARTIE = p.ID
    WHERE t.PERSONNE = 100
    GROUP BY t.titre
    J'y ai mis des alias pour alléger la lecture de la requête.

    Si on met la condition sur l'année dans le WHERE, on casse le LEFT JOIN.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par Fredo02 Voir le message
    Le schéma n'est pas représentatif de mon vrai soucis. C'est le scénario que j'ai trouvé pour résumé la problématique. Sinon oui il joue tout seul dans cette exemple. Une idée pour le problème ?
    Pour ce que j'en comprends, je pense qu'il faut faire une sous-requête qui renvoie la liste des "tables" de la bonne personne, et ensuite joindre cette requête par une jointure classique (c.a.d pas externe) à la table partie elle-même jointe à la table carte le tout avec un where sur le critère d'année.

Discussions similaires

  1. [CR9] faire une Jointure externe
    Par coldec dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 28/06/2005, 12h10
  2. Jointure externe compliquée
    Par miniil dans le forum Langage SQL
    Réponses: 9
    Dernier message: 19/02/2004, 09h27
  3. Jointure externe qui ne fonctionne pas
    Par Guizz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2004, 12h26
  4. [ jointure externe ] j'y pompe rien
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/12/2003, 17h57
  5. [Interbase] [Triggers] jointure externe
    Par AnestheziE dans le forum InterBase
    Réponses: 9
    Dernier message: 17/11/2003, 16h17

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