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 :

Requete select : jointure avec champs null


Sujet :

Langage SQL

  1. #1
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut Requete select : jointure avec champs null
    Bonjour,
    j'ai un soucis au niveau d'un select.
    Je vous montre un des exemples qui coincent, ainsi je pourrais le résoudre pour tous.
    Requete sans jointure avec table ville(id_ville, nom_ville) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT personne.id_personne, PERSONNE.NOM_PERSONNE, PERSONNE.PRENOM_PERSONNE, 
    MEMBRE.NO_CARTE, MEMBRE.DATE_ENTREE, PERSONNE.DATE_NAISSANCE, MEMBRE.EMAIL, VILLE.NOM_VILLE, 
    MEMBRE.ADRESSE, MEMBRE.CODE_POSTAL, SITUATION_FAMILIALE.NOM_SITUATION_FAMILIALE,
    membre.id_situation_familiale, service.id_service, ville.id_ville, SERVICE.NOM_SERVICE 
    from personne, membre, situation_familiale, service, ville
    where personne.id_personne = membre.id_personne
    and membre.id_situation_familiale = situation_familiale.id_situation_familiale
    and service.id_service = membre.id_service
    order by personne.nom_personne, personne.prenom_personne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    22	assas	dfgf	154	2002-12-12 00:00:00.000	NULL		Metz		NULL	Célibataire	0	2	0	Homes
    22	assas	dfgf	154	2002-12-12 00:00:00.000	NULL		Woippy		NULL	Célibataire	0	2	1	Homes
    22	assas	dfgf	154	2002-12-12 00:00:00.000	NULL		Nancy		NULL	Célibataire	0	2	2	Homes
    22	assas	dfgf	154	2002-12-12 00:00:00.000	NULL		Berlin		NULL	Célibataire	0	2	12	Homes
    22	assas	dfgf	154	2002-12-12 00:00:00.000	NULL		hrbrfgbfbn		NULL	Célibataire	0	2	22	Homes
    (et ça continue...)

    Résultat logique puisque produit cartésion.
    Le soucis c'est que ce membre a un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     id_ville pouvant être NULL
    Donc quand je fais la jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     membre.id_ville = ville.id_ville
    les lignes n'ayant pas d'id_ville n'apparaissent plus (logique puisque id_ville dans ville n'est jamais NULL...

    Je sais que c'est moche les champs null mais je suis parti dans ce sens...

    Avez vous une idée?
    Merci par avance.
    Cordialement,
    Tid.

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Certains membres n'ont pas de villes.
    Tu peux faire la jointure externe entre membre et ville ?
    (membre LEFT OUTER JOIN ville ON membre.id_ville = ville.id_ville)

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  3. #3
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT personne.id_personne, PERSONNE.NOM_PERSONNE, PERSONNE.PRENOM_PERSONNE, 
    MEMBRE.NO_CARTE, MEMBRE.DATE_ENTREE, PERSONNE.DATE_NAISSANCE, MEMBRE.EMAIL, ville.NOM_VILLE, 
    MEMBRE.ADRESSE, MEMBRE.CODE_POSTAL, SITUATION_FAMILIALE.NOM_SITUATION_FAMILIALE,
    membre.id_situation_familiale, service.id_service, ville.id_ville, SERVICE.NOM_SERVICE 
    from personne, situation_familiale, service, ville, membre
    left outer join ville v on membre.id_ville = v.id_ville
    where personne.id_personne = membre.id_personne
    and membre.id_situation_familiale = situation_familiale.id_situation_familiale
    and service.id_service = membre.id_service
    order by personne.nom_personne, personne.prenom_personne
    ne me fait pas de jointure entre les tables ville et membre...

  4. #4
    Membre régulier
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 82
    Points
    82
    Par défaut
    Salut,
    j'ai une solution mais elle est bourine:
    tu met dans la table ville une ligne -1 NULL ...
    et au lieu de mettre NULL dans l'autre table pour id_ville tu met -1

    je sais c'est limite comme façon de faire mais si tu trouve pas mieux tu pourrais essayer ...

  5. #5
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    Salut,
    oui j'ai pensé faire pareil il y a quelques semaines mais ça me fait modifier pas mal de choses au niveau procédures stockées, et programmation (liste déroulante de ville).
    De plus comme tu le dis c'est un peu moche...

    Je précise que je travaille sous MS SQL Server 2005.

  6. #6
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    Citation Envoyé par Tidus159 Voir le message
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT personne.id_personne, PERSONNE.NOM_PERSONNE, PERSONNE.PRENOM_PERSONNE, 
    MEMBRE.NO_CARTE, MEMBRE.DATE_ENTREE, PERSONNE.DATE_NAISSANCE, MEMBRE.EMAIL, ville.NOM_VILLE, 
    MEMBRE.ADRESSE, MEMBRE.CODE_POSTAL, SITUATION_FAMILIALE.NOM_SITUATION_FAMILIALE,
    membre.id_situation_familiale, service.id_service, ville.id_ville, SERVICE.NOM_SERVICE 
    from personne, situation_familiale, service, ville, membre
    left outer join ville v on membre.id_ville = v.id_ville
    where personne.id_personne = membre.id_personne
    and membre.id_situation_familiale = situation_familiale.id_situation_familiale
    and service.id_service = membre.id_service
    order by personne.nom_personne, personne.prenom_personne
    ne me fait pas de jointure entre les tables ville et membre...
    bonjour,

    en quoi ca ne fait pas de jointure?

    peux tu donner un petit exemple avec juste les tables ville et membre pour avoir un petit exemple de ce que tu cherches

    Merci

    Michel

  7. #7
    Membre régulier
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 82
    Points
    82
    Par défaut
    Dans ce cas là l'autre solution est plus lourde à ecrire:

    tu fait une requette simple
    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
     
    SELECT personne.id_personne, 
    		PERSONNE.NOM_PERSONNE, 
    		PERSONNE.PRENOM_PERSONNE, 
    		MEMBRE.NO_CARTE, 
    		MEMBRE.DATE_ENTREE, 
    		PERSONNE.DATE_NAISSANCE, 
    		MEMBRE.EMAIL, 
    		MEMBRE.ADRESSE, 
    		MEMBRE.CODE_POSTAL, 
    		SITUATION_FAMILIALE.NOM_SITUATION_FAMILIALE,
    		membre.id_situation_familiale, 
    		service.id_service, 
    		SERVICE.NOM_SERVICE 
    FROM personne, 
    		situation_familiale, 
    		service, 
    		membre
    WHERE personne.id_personne = membre.id_personne
    		AND membre.id_situation_familiale = situation_familiale.id_situation_familiale
    		AND service.id_service = membre.id_service
    ORDER BY personne.nom_personne, 
    		personne.prenom_personne
    et après tu fais une sous-requette pour chaque résultat que te servira à recupérer ce qu'il te manque pour la ville

    (le code que je te met n'est que le tien avec les ligne contenant ville retiré)

  8. #8
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    Bonjour,
    simplifions les données pour garder uniquement mon problème :
    tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Personne (id_personne, nom_personne)
    Membre (id_personne, id_ville - NULL AUTORISE-)
    Ville (id_ville, nom_ville)
    Ma table personne comporte :
    2 Nom1
    22 Nom2
    29 Nom3
    52 Nom4
    Ma table ville comporte :
    0 Metz
    1 Woippy
    2 Nancy
    12 Berlin
    22 hrbrfgbfbn
    26 Paris
    32 uikiuoi

    Requete avec left outer join :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT PERSONNE.NOM_PERSONNE, ville.NOM_VILLE
    FROM personne, ville, membre
    LEFT OUTER JOIN ville v ON membre.id_ville = v.id_ville
    WHERE personne.id_personne = membre.id_personne
    ORDER BY personne.nom_personne, personne.prenom_personne
    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
     
     
    Nom1	Metz
    Nom1	Woippy
    Nom1	Nancy
    Nom1	Berlin
    Nom1	hrbrfgbfbn
    Nom1	Paris
    Nom1	uikiuoi
    Nom2	Metz
    Nom2	Woippy
    Nom2	Nancy
    Nom2	Berlin
    Nom2	hrbrfgbfbn
    Nom2	Paris
    Nom2	uikiuoi
    Nom3	Metz
    Nom3	Woippy
    Nom3	Nancy
    Nom3	Berlin
    Nom3	hrbrfgbfbn
    Nom3	Paris
    Nom3	uikiuoi
    Nom4	Metz
    Nom4	Woippy
    Nom4	Nancy
    Nom4	Berlin
    Nom4	hrbrfgbfbn
    Nom4	Paris
    Nom4	uikiuoi
    Requete avec clause where classique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT PERSONNE.NOM_PERSONNE, ville.NOM_VILLE
    FROM personne, ville, membre
    where membre.id_ville = ville.id_ville
    and personne.id_personne = membre.id_personne
    ORDER BY personne.nom_personne, personne.prenom_personne
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Nom1	Nancy
    Nom4	Woippy
    On remarque que je perds 2 membres car ils ont une valeur pour id_ville...
    left outer join n'est pas bleuté sous ms sql... peut être que cela ne fonctionne pas sur ce sgbd

    Ai je été plus clair?
    Voyez vous une solution?

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 805
    Points
    30 805
    Par défaut
    C'est peut-être ça que tu cherches à faire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  personne.nom_personne
        ,   ville.nom_ville
    FROM    personne
        INNER JOIN
            membre
            ON  personne.id_personne = membre.id_personne
        LEFT OUTER JOIN 
            ville 
            ON  membre.id_ville = ville.id_ville
    ORDER BY personne.nom_personne
        ,   personne.prenom_personne
    ;
    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.

  10. #10
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    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
     
    SELECT personne.id_personne, PERSONNE.NOM_PERSONNE, PERSONNE.PRENOM_PERSONNE, 
    MEMBRE.NO_CARTE, MEMBRE.DATE_ENTREE, PERSONNE.DATE_NAISSANCE, MEMBRE.EMAIL, VILLE.NOM_VILLE, 
    MEMBRE.ADRESSE, MEMBRE.CODE_POSTAL, SITUATION_FAMILIALE.NOM_SITUATION_FAMILIALE,
    membre.id_situation_familiale, service.id_service, ville.id_ville, SERVICE.NOM_SERVICE 
    from personne, membre, situation_familiale, service, ville
    where personne.id_personne = membre.id_personne
    and membre.id_situation_familiale = situation_familiale.id_situation_familiale
    and service.id_service = membre.id_service
    and ville.id_ville = membre.id_ville
     
    UNION
    SELECT personne.id_personne, PERSONNE.NOM_PERSONNE, PERSONNE.PRENOM_PERSONNE, 
    MEMBRE.NO_CARTE, MEMBRE.DATE_ENTREE, PERSONNE.DATE_NAISSANCE, MEMBRE.EMAIL, '', 
    MEMBRE.ADRESSE, MEMBRE.CODE_POSTAL, SITUATION_FAMILIALE.NOM_SITUATION_FAMILIALE,
    membre.id_situation_familiale, service.id_service, '', SERVICE.NOM_SERVICE 
    from personne, membre, situation_familiale, service
    where personne.id_personne = membre.id_personne
    and membre.id_situation_familiale = situation_familiale.id_situation_familiale
    and service.id_service = membre.id_service
    and  membre.id_ville is null
     
    order by personne.nom_personne, personne.prenom_personne
    Après avoir lu quelques posts j'ai découvert le 'is null'
    Cela marche !

    Merci pour vos réponses.
    @+,
    Tid.
    [résolu]

    Edit : ça marche aussi al1 ! bien vu ! Merci

  11. #11
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    salut,

    dans ton exemple, il manque deja les lignes de la table membre pour qu'on comprenne ainsi que le résultat que tu attends

    revenons sur ta requete, ecris la comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT PERSONNE.NOM_PERSONNE, ville.NOM_VILLE
    FROM personne
    JOIN membre ON  personne.id_personne = membre.id_personne
    LEFT JOIN ville ON membre.id_ville = ville.id_ville
    ORDER BY personne.nom_personne, personne.prenom_personne

  12. #12
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    cyber ta requete fonctionne aussi... Comme quoi y'avait de la solution

    Soit dit en passant j'ai fait mon post clairement pour que pour chaque colonne resultat de la requete tu ais les colonnes resultat juste en dessous, je n'ai pas pensé a renoter les titre des colonnes...


    C'est très intéressant de voir des requêtes avec des INNER JOIN , JOIN ON , LEFT OUT JOIN, merci !

    @+,
    Tid

  13. #13
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    Bonjour, en fait j'ai un petit soucis...
    Si je prends vos 2 requêtes, quand il join avec un champ vide, il le note NULL et j'aimerais plutôt qu'il mette une chaine vide.
    Avez vous une idée?

  14. #14
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Je sais que al1_24 est dans le coin

    Utilise COALESCE
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



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

Discussions similaires

  1. Résultat jointure avec champs null
    Par ideal23 dans le forum Langage SQL
    Réponses: 26
    Dernier message: 12/12/2011, 11h12
  2. [AC-2003] Requete select, problème avec "or is null"
    Par sinifroth dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 28/10/2010, 22h14
  3. jointure avec champ à null
    Par radahm dans le forum PL/SQL
    Réponses: 2
    Dernier message: 03/11/2009, 10h51
  4. [DEBUTANT]requete de jointure avec identifiant quand ds une table
    Par tripper.dim dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/05/2006, 13h46
  5. Requete select imbriqués avec plusieurs références
    Par GAlion dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/08/2004, 14h06

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