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 :

SQL join et count sur trois tables


Sujet :

Langage SQL

  1. #1
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 45
    Par défaut SQL join et count sur trois tables
    Bonjour,
    je bute sur une requête sur une base Oracle que je pense possible ...

    3 tables :
    Table A
    IdA
    champA1
    champA2

    Table B
    IdB
    fkIdA (foreign key table A)

    Table C
    IdC
    fkIdB (foreign key table B)
    status

    resultat attendu :
    A.* + count(table C where status = 102)

    et si pour une ligne de A, il n'y a pas de ligne dans C (ou pas de ligne avec le status 102) alors résultat attendu = A.* et 0

    je suis parti sur ça mais ça ne me donne pas les lignes pour count = 0 ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select A.IdA, count(C.IdC) from A inner join B on A.IdA = B.fkIdA inner join C on B.IdB = C.fkIdB group by A.IdA
    une idée SVP ?

  2. #2
    Membre Expert
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Par défaut
    Bonjour

    Essaye plutôt avec LEFT JOIN sur la table C

    parce que avec INNER JOIN s'il n'y a pas de ligne dans C, il ne peut avoir de lignes résultantes par la requête.

    a+

  3. #3
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 45
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    Bonjour
    Essaye plutôt avec LEFT JOIN sur la table C
    merci : effectivement ça marche mieux mais pas totalement encore comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select A.IdA, count(C.IdC) from A inner join B on A.IdA = B.fkIdA left join C on B.IdB = C.fkIdB group by A.IdA
    me manque encore le critère where C.status = 102.
    si je modifie ma requête comme ça, je n'ai plus rien (car aucune ligne n'a le status 102), alors que je m'attends à avoir 100% de la table A avec count = 0 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select A.IdA, count(C.IdC) from A inner join B on A.IdA = B.fkIdA left join C on B.IdB = C.fkIdB where C.status = 102 group by A.IdA

  4. #4
    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 : 48
    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
    Remontez le critère dans la clause de jointure.
    Le positionner dans le WHERE entraîne la transformation de votre jointure ouverte en jointure forte.

    Un peu de lecture :
    http://blog.developpez.com/cinephil/...ion_de_restric

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 143
    Par défaut
    Il faut ramener la restriction sur C dans les conditions de la jointure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT  A.IdA
        ,   COUNT(C.IdC) 
    FROM    A 
        INNER JOIN 
            B 
            ON  A.IdA = B.fkIdA 
        LEFT JOIN 
            C 
            ON  B.IdB = C.fkIdB 
            AND C.status = 102 
    GROUP BY A.IdA
    Quand tu écris WHERE C.status = 102, implicitement C.status ne peut être NULL et donc la jointure externe sur C est prise en compte comme une jointure interne.

    Edit : grilled
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 45
    Par défaut
    pu... c'est bon de trouver des gens compétents !
    merci à tous, ça semble fonctionner : je fais qques tests et je passe le fil en résolu si ça se confirme

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

Discussions similaires

  1. [SQL] count() sur plusieurs tables
    Par philodido dans le forum Langage SQL
    Réponses: 21
    Dernier message: 14/10/2011, 10h56
  2. [MySQL] Requête SQL complexe sur trois tables
    Par NET_Nicolas dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 03/08/2011, 18h24
  3. Requete SQL avec jointure sur trois tables
    Par pit2121 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/05/2008, 23h07
  4. Requête SQL avec jointure sur trois tables
    Par pit2121 dans le forum SQL
    Réponses: 0
    Dernier message: 19/05/2008, 20h24
  5. [SQL Server 8] Discussion : Full Jointure sur trois tables
    Par Baquardie dans le forum Langage SQL
    Réponses: 5
    Dernier message: 22/12/2006, 14h01

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