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

MySQL Discussion :

un fonctionnement inattendu de LEFT JOIN [MySQL-5.0]


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2014
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Janvier 2014
    Messages : 89
    Par défaut un fonctionnement inattendu de LEFT JOIN
    Bonjour

    Voilà une requête LEFT JOIN qui ne fonctionne pas comme je l'attend
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT dd.* , s.nom FROM dossierdet as dd  LEFT JOIN societe as s on fk_soc = s.rowid WHERE  fk_dossier =6
    Est-ce que je me trompe?
    La table société est la table de référence des tiers.
    Dans la table dossierdet , chaque élément a un tiers (dans fk_soc) , référencé dans la table société (s.rowid) .
    Je voudrais que cette requête affiche tous les éléments de dossierdet et les noms des tiers quand une valeur est dans fk_soc

    Or cette requête ne me présente pas les éléments de dossierdet dont fk_soc est à 0 ou à Null.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    J'ai bien une solution
    SELECT DISTINCT dd.* , s.nom FROM dossierdet as dd  , societe as s WHERE  fk_dossier =6 and on fk_soc = s.rowid 
    union
    SELECT DISTINCT dd.* , '' FROM dossierdet as dd  WHERE  fk_dossier =6 and (fk_soc = 0 or isnull(fk_soc))
    Mais est-ce la seule façon?

    Claude

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 883
    Par défaut
    Salut Claude.

    Citation Envoyé par Claude30120
    Est-ce que je me trompe?
    Vous faites un 'left outer join' entre la table A et la table B.
    Normalement, vous avez toutes les lignes de la table A.
    Pour les lignes de la tables B, vous avez deux cas :
    --> les lignes qui sont en relation avec celles de la table A.
    --> les lignes qui n'existent pas dans la table B.

    Donc votre requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM            dossierdet as dd
    LEFT OUTER JOIN societe    as s
    on    dd.fk_soc     = s.rowid
    WHERE dd.fk_dossier = 6
    est correcte, et vous ne vous trompez pas !

    Citation Envoyé par Claude30120
    Or cette requête ne me présente pas les éléments de dossierdet dont fk_soc est à 0 ou à Null.
    C'est tout à fait normal. La jointure que vous définissez :
    a un sens quand 'fk_soc' existe (la clef de la première table) !

    La valeur NULL est un cas particulier qui représente l'absence d'information.
    Même si vous avez dans la seconde table des NULL, la jointure ne se fera pas sur le NULL.

    Tandis que pour le 0 (zéro), c'est bien une information et normalement la jointure devrait se faire, à condition d'avoir un 0 (zéro) dans la seconde table.

    Un 'inner join' permet de définir l'intersection entre les deux tables. Mais tu n'auras pas les lignes de la première table si aucun relation existe dans la seconde table.

    Un 'A left OUTER JOIN B' c'est exactement la même chose que B RUGHT OUTER JOIN A'.

    Le 'A FULL JOIN B' n'existe pas sous MySql, mais on peut le simuler. C'est un :
    A LEFT OUTER JOIN B
    UNION
    A RIGHT OUTER JOIN B.

    @+

  3. #3
    Membre confirmé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2014
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Janvier 2014
    Messages : 89
    Par défaut
    Merci, Artemus

    Effectivement, 0 n'est pas NULL, j'ai zappé ce fait.
    Merci pour l'explication

    Cordialement
    Claude.

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

Discussions similaires

  1. LEFT JOIN ne fonctionne pas
    Par gastoncs dans le forum Requêtes
    Réponses: 5
    Dernier message: 02/04/2012, 13h27
  2. Réponses: 3
    Dernier message: 06/06/2007, 18h45
  3. Fonctionnement left join
    Par Raay dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/09/2005, 12h57
  4. Non coincident MySQL (Left Join)
    Par Remiguel dans le forum Requêtes
    Réponses: 6
    Dernier message: 03/11/2003, 21h25
  5. Export d'une vue avec LEFT JOIN
    Par schnourf dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/05/2003, 13h57

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