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 :

[Débutant] Jointure externe ne renvoie pas la totalité des résultats


Sujet :

Langage SQL

  1. #1
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut [Débutant] Jointure externe ne renvoie pas la totalité des résultats
    Bonjour,

    Base de données utilisée, MySQL.

    Voici mon problème. Je cherche à extraire de mes données des logements. Cela fonctionne.

    Ceux-ci sont occupés ou non et je désire obtenir les logements occupés ou non.

    J'ai donc d'abord fait une jointure externe sur la table `OCCUPATION`, cela semble fonctionner, tant que je n'inclus pas des critères relatifs à cette table dans la clause WHERE.

    Mon code :

    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
    41
    42
    43
    44
    45
    46
    47
    SELECT imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
        , log.NUMERO_ENTREE
        , log.ETAGE
        , log.NOMBRE_PIECE
        , log.NUMERO_GERANCE
        , log.NUMERO_FEDERAL
        , occup.DATE_EFFET
        , occup.DATE_FIN_BAIL
        , occup.STATUT_OCCUPATION_ID_FK
        , loc.NOM
        , loc.PRENOM
        , clog.MONTANT_LOYER_ABAISSE + alog.MONTANT_MENSUEL_COMMUNE + alog.MONTANT_MENSUEL_CANTON + alog.MONTANT_MENSUEL_TIERS AS LOYER_BRUT
        , alog.MONTANT_MENSUEL_CANTON
        , alog.MONTANT_MENSUEL_COMMUNE
        , alog.MONTANT_MENSUEL_TIERS
        , clog.MONTANT_LOYER_ABAISSE
        , alog.ASI
        , alog.ASII
        , ALOG.ASIII
        , ALOG.ASIV
    FROM IMMEUBLE AS imm
    JOIN COMMUNE AS comm
    ON comm.ID = imm.COMMUNE_ID_FK
    INNER JOIN LOGEMENT AS log
    ON log.IMMEUBLE_ID_FK = imm.ID
    LEFT JOIN OCCUPATION AS occup
    ON occup.LOGEMENT_ID_FK = log.ID
    INNER JOIN OCCUPANT as loc
    ON occup.ID = loc.OCCUPATION_ID_FK
    INNER JOIN COUT_LOGEMENT AS clog
    ON clog.LOGEMENT_ID_FK = log.ID
    INNER JOIN AIDE_LOGEMENT AS alog
    ON alog.LOGEMENT_ID_FK = log.ID
    WHERE imm.DELEGATION_COMPETENTE = 1
        AND comm.NOM_COMMUNE = 'xxxxxxxx'
        AND occup.STATUT_OCCUPATION_ID_FK = 5
        AND occup.DATE_EFFET <= '2015-01-01'
        AND (occup.DATE_FIN_BAIL > '2015-01-01' OR occup.DATE_FIN_BAIL IS NULL)
        AND loc.PRENEUR_BAIL = TRUE
        AND clog.DEBUT_PERIODE = '2015-01-01'
        AND alog.DEBUT_PERIODE = '2015-01-01'
    ORDER BY imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
        , log.NUMERO_ENTREE
        , log.ETAGE
        , log.NUMERO_GERANCE;
    Je pense qu'il faudrait d'abord que je traite les lignes 37-39 dans une sous-requête, mais je ne sais pas comment faire.

    J'ai fait des essais, mais j'ai au mieux une erreur comme quoi ma sous-requête renvoie plus d'une ligne.

    Pouvez-vous m'aider ?

    Grand merci d'avance.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur en études décisionnelles
    Inscrit en
    Février 2013
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur en études décisionnelles

    Informations forums :
    Inscription : Février 2013
    Messages : 134
    Points : 351
    Points
    351
    Par défaut
    Bonjour,
    J'ai eu le même souci récemment, et je l'ai contourné en mettant la condition dans la jointure comme suit :

    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
    41
    42
    43
    44
    45
     
    SELECT imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
        , log.NUMERO_ENTREE
        , log.ETAGE
        , log.NOMBRE_PIECE
        , log.NUMERO_GERANCE
        , log.NUMERO_FEDERAL
        , occup.DATE_EFFET
        , occup.DATE_FIN_BAIL
        , occup.STATUT_OCCUPATION_ID_FK
        , loc.NOM
        , loc.PRENOM
        , clog.MONTANT_LOYER_ABAISSE + alog.MONTANT_MENSUEL_COMMUNE + alog.MONTANT_MENSUEL_CANTON + alog.MONTANT_MENSUEL_TIERS AS LOYER_BRUT
        , alog.MONTANT_MENSUEL_CANTON
        , alog.MONTANT_MENSUEL_COMMUNE
        , alog.MONTANT_MENSUEL_TIERS
        , clog.MONTANT_LOYER_ABAISSE
        , alog.ASI
        , alog.ASII
        , ALOG.ASIII
        , ALOG.ASIV
    FROM IMMEUBLE AS imm
    JOIN COMMUNE AS comm
    ON comm.ID = imm.COMMUNE_ID_FK
    INNER JOIN LOGEMENT AS log
    ON log.IMMEUBLE_ID_FK = imm.ID
    LEFT JOIN OCCUPATION AS occup
    ON occup.LOGEMENT_ID_FK = log.ID AND occup.STATUT_OCCUPATION_ID_FK = 5 AND occup.DATE_EFFET <= '2015-01-01' AND (occup.DATE_FIN_BAIL > '2015-01-01' OR occup.DATE_FIN_BAIL IS NULL)
    INNER JOIN OCCUPANT as loc
    ON occup.ID = loc.OCCUPATION_ID_FK
    INNER JOIN COUT_LOGEMENT AS clog
    ON clog.LOGEMENT_ID_FK = log.ID
    INNER JOIN AIDE_LOGEMENT AS alog
    ON alog.LOGEMENT_ID_FK = log.ID
    WHERE imm.DELEGATION_COMPETENTE = 1
        AND comm.NOM_COMMUNE = 'xxxxxxxx'
        AND loc.PRENEUR_BAIL = TRUE
        AND clog.DEBUT_PERIODE = '2015-01-01'
        AND alog.DEBUT_PERIODE = '2015-01-01'
    ORDER BY imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
        , log.NUMERO_ENTREE
        , log.ETAGE
        , log.NUMERO_GERANCE;
    Voir ligne 29.
    Bon courage

  3. #3
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Bonsoir,

    Pas d'erreur mais aucun changement, j'ai toujours le même nombre de résultats.

    Peut-être est-ce lié au fait qu'à ma table `OCCUPATION`, j'ai une table liée `OCCUPANT`, également avec un critère dans la clause WHERE.

    En fait, si je n'ai pas d'enregistrement lié dans la table `OCCUPATION`, il n'existe aucun enregistrement lié dans la table `OCCUPANT`.

    Dans ce cas, je désire que le logement soit compris dans le résultat, avec des informations "NULL" concernant l'occupant.

    Merci déjà pour cette première réponse.
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Tu as une jointure externe sur OCCUPATION, donc toutes les conditions que tu mettras dans le where sur un champ de cette table doivent inclure le cas ou la table jointe ne renvoie rien (donc les champs à null), sinon ta jointure est implicitement transformée en jointure interne.

    Attention aussi, tu fais une jointure interne (OCCUPANT) sur une table précédemment jointe de façon externe. Je ne suis pas sûr que cela conserve la jointure externe et ne la transforme pas en jointure interne.

    Et même remarque concernant les champs de cette seconde jointure dans le where.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  5. #5
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Effectivement, lorsqu'on fait une jointure externe sur une table, toutes les conditions de restriction sur cette table doivent figurer dans la condition de jointure.
    Explications du phénomène sur mon blog.

    En toute rigueur, lire aussi les commentaires de fsmrel sur ce billet de blog et le commentaire de conclusion qui m'amènerait à modifier mon billet à l'occasion.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  6. #6
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Bonjour,

    Alors effectivement, j'obtiens bien le résultat attendu.

    Pour cela, j'ai également dû modifier la jointure de ma table `OCCUPANT`.

    Le code modifié :

    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
    41
    42
    43
    SELECT imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
        , log.NUMERO_ENTREE
        , log.ETAGE
        , log.NOMBRE_PIECE
        , log.NUMERO_GERANCE
        , log.NUMERO_FEDERAL
        , occup.DATE_EFFET
        , occup.DATE_FIN_BAIL
        , occup.STATUT_OCCUPATION_ID_FK
        , loc.NOM
        , loc.PRENOM
        , clog.MONTANT_LOYER_ABAISSE + alog.MONTANT_MENSUEL_COMMUNE + alog.MONTANT_MENSUEL_CANTON + alog.MONTANT_MENSUEL_TIERS AS LOYER_BRUT
        , alog.MONTANT_MENSUEL_CANTON
        , alog.MONTANT_MENSUEL_COMMUNE
        , alog.MONTANT_MENSUEL_TIERS
        , clog.MONTANT_LOYER_ABAISSE
        , alog.ASI
        , alog.ASII
        , alog.ASIII
        , alog.ASIV
    FROM IMMEUBLE AS imm
    JOIN COMMUNE AS comm
    ON comm.ID = imm.COMMUNE_ID_FK
    INNER JOIN LOGEMENT AS log
    ON log.IMMEUBLE_ID_FK = imm.ID
    LEFT JOIN OCCUPATION AS occup
    ON occup.LOGEMENT_ID_FK = log.ID AND occup.STATUT_OCCUPATION_ID_FK = 5 AND occup.DATE_EFFET <= '2015-01-01' AND (occup.DATE_FIN_BAIL > '2015-01-01' OR occup.DATE_FIN_BAIL IS NULL)
    LEFT JOIN OCCUPANT as loc
    ON occup.ID = loc.OCCUPATION_ID_FK AND loc.PRENEUR_BAIL = TRUE
    INNER JOIN COUT_LOGEMENT AS clog
    ON clog.LOGEMENT_ID_FK = log.ID
    INNER JOIN AIDE_LOGEMENT AS alog
    ON alog.LOGEMENT_ID_FK = log.ID
    WHERE imm.DELEGATION_COMPETENTE = 1
        AND comm.NOM_COMMUNE = 'xxxxxxxx'
        AND clog.DEBUT_PERIODE = '2015-01-01'
        AND alog.DEBUT_PERIODE = '2015-01-01'
    ORDER BY imm.NUMERO_DOSSIER
        , imm.LETTRE_DOSSIER
        , log.NUMERO_ENTREE
        , log.ETAGE
        , log.NUMERO_GERANCE;
    Merci à tous les trois pour vos réponses
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

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

Discussions similaires

  1. Formulaire dynamique qui ne me renvoie pas les valeurs des champs
    Par heero37 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/08/2014, 12h40
  2. Jointure externe ne fonctionnant pas (Je pense)
    Par miketidy dans le forum Requêtes
    Réponses: 3
    Dernier message: 24/11/2010, 17h35
  3. [PDO] Pas d'affichage des résultats
    Par jmtrivia dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 04/05/2010, 11h05
  4. [Mysql 5.0.22] Probleme jointure externe; ne marche pas ?
    Par Floweract dans le forum Langage SQL
    Réponses: 5
    Dernier message: 01/11/2006, 12h17
  5. jointure externe et renvoi de valeurs NULL
    Par ctobini dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 21/09/2006, 10h57

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