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 :

Requête SELECT sur deux tables


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 13
    Points
    13
    Par défaut Requête SELECT sur deux tables
    Bonjour à tous.
    Nouveau sur le forum et débutant en SQL, j'ai eu beau faire des recherches je n'ai pas trouvé la réponse à mon soucis que doivent pourtant rencontrer tous les développeurs...
    Je vous prie de m'excuser si le sujet a déjà été traité.

    2 Tables

    CLIENTS
    IDCLIENTS mediumint(9) AUTO_INCREMENT
    NOMCLI char(100)
    CODFAMI char(5)

    FAMILLES
    IDFAMILLE mediumint(9) AUTO_INCREMENT
    CODFAMI char(5)
    LIBFAMILLE char(100)

    Afin d'obtenir la liste des clients avec le libellé de la famille de chacun d'eux je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CLIENTS.NOMCLI, FAMILLES.LIBELLE, CLIENTS.IDCLIENTS FROM CLIENTS, FAMILLES WHERE FAMILLES.CODFAMI = CLIENTS.CODFAMI
    J'obtiens bien la liste des clients dont le code famille figure dans le fichier FAMILLES or deux enregistrements de la table CLIENTS possèdent un CODFAMI (non NULL) qui n'existe pas dans la table FAMILLES et donc ces deux clients ne ressortent pas dans le résultat de ma requête.

    Comment dois-je m'y prendre pour faire apparaitre aussi ces deux enregistrements ?

    Je remercie par avance les âmes charitables qui sauront m'instruire

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Faites une petite recherche sur les jointures externes !

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Commencez aussi par faire de vraies jointures et non un salmigondis de projection, produit cartésien et restrictions.
    les jointures se font avec JOIN suivi d'un prédicat introduit par ON.
    A lire : http://sqlpro.developpez.com/cours/s...ointures/#LIII
    Commencez donc pas apprendre SQL. mon livre, comme mon site web est fait pour vous aider !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 13
    Points
    13
    Par défaut
    Merci pour cette aide.

    Etes-vous toujours aussi gais et chaleureux ?
    Heureusement que je me suis préalablement excusé d'être nul en SQL...

    Excusez-moi cette fois-ci pour le bruit.

  5. #5
    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 !

    On n'est pas tous comme ça, t'inquiète

    Et puis tu peux lui mettre un pouce vers le bas (en bas à droite) si tu trouve son attitude discourtoise ou autre... (non pas que ça serve à grand chose, mais ça défoule)


    Quoi qu'il en soit, courage pour l'apprentissage du SQL !

    (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/

  6. #6
    Membre habitué Avatar de tfc3146
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Février 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur décisionnel
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Février 2009
    Messages : 79
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    La requête que vous avez écrit est de la norme SQL1, alors que le JOIN ... ON c'est du SQL2 (arrêtez moi si je me trompe).

    Donc, les 2 requêtes sont possibles c'est en tout cas ce que l'on m'a toujours dit.

    Avez-vous trouvez la solution ?
    C'est en faisant n'importe quoi qu'on devient n'importe qui
    Si un message vous a aidé, n'hésitez pas à mettre +1

  7. #7
    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
    Citation Envoyé par tfc3146 Voir le message
    La requête que vous avez écrit est de la norme SQL1, alors que le JOIN ... ON c'est du SQL2 (arrêtez moi si je me trompe).

    Donc, les 2 requêtes sont possibles c'est en tout cas ce que l'on m'a toujours dit.
    Les deux syntaxes sont encore acceptées par les SGBD mais la syntaxe de jointure avec FROM WHERE est obsolète depuis 1992, soit près de 20 ans ! Il serait temps de se mettre à la page, non ?

    Hélas, certains n'ayant pas cet âge apprennent encore en premier une syntaxe révolue depuis avant leur naissance !
    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 !

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 214
    Points
    214
    Par défaut
    Au risque de passer pour un vieux (j'ai que 32 ans ), si vous tenez absolument à utiliser l'ancienne norme, la syntaxe est de remplace le "=" dans le where par soit "*=", soit "=*" en fonction du coté vers lequel on souhaite avoir toutes les lignes.

    Dans votre exemple ca donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE FAMILLES.CODFAMI =* CLIENTS.CODFAMI
    pour avoir tous les clients, même ceux qui n'ont pas de famille.

    PS : je tiens à préciser que ce n'est pas parce que je connais cette syntaxe que je l'utilise encore

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par captainKirk Voir le message
    si vous tenez absolument à utiliser l'ancienne norme, la syntaxe est de remplace le "=" dans le where par soit "*=", soit "=*" en fonction du coté vers lequel on souhaite avoir toutes les lignes.
    Ça dépend du SGBD !

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 214
    Points
    214
    Par défaut
    Ah désolé, ça c'est sous SQL Server

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 13
    Points
    13
    Par défaut
    Ah bah voila qui est plus sympa .
    Merci à vous tous de votre aide. Le tuto indiqué par SQLpro est merveilleux Merci
    Je précise au passage que jusqu'à maintenant je m'étais débrouillé avec la doc en ligne de MySQL 5...

    Voila le style de requête qui se trouve maintenant dans mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CLIENTS.NOMCLI, FAMILLES.LIBELLE, CLIENTS.IDCLIENTS 
    FROM CLIENTS 
    LEFT OUTER JOIN FAMILLES ON CLIENTS.CODFAMI = FAMILLES.CODFAMI
    WHERE (CLIENTS.CODFAMI = FAMILLES.CODFAMI OR FAMILLES.CODFAMI IS NULL)
    Le résultat est satisfaisant.

    Cette syntaxe vous semble-t-elle correcte ou améliorable ?

  12. #12
    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
    Tu n'as pas besoin du WHERE puisqu'il contient la condition de jointure figurant déjà après le ON de la jointure ou une condition de nullité sur la famille, ce qui est implicite par la jointure externe gauche.

    Si tu peux changer la structure de la BDD, normalement, ce n'est pas le code famille qui devrait figurer dans la table clients mais l'identifiant de la famille. Et la jointure de ta requête devrait donc être faite sur l'égalité de cet identifiant.
    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 !

  13. #13
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2011
    Messages : 4
    Points : 13
    Points
    13
    Par défaut
    Oui en effet CinePhil Merci

    J'ai corrigé mon code en conséquence et le résultat est top.

    La requête est donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT CLIENTS.NOMCLI, FAMILLES.LIBELLE, CLIENTS.IDCLIENTS 
    FROM CLIENTS 
    LEFT OUTER JOIN FAMILLES ON CLIENTS.CODFAMI = FAMILLES.CODFAMI
    Citation Envoyé par CinePhil Voir le message
    Si tu peux changer la structure de la BDD, normalement, ce n'est pas le code famille qui devrait figurer dans la table clients mais l'identifiant de la famille. Et la jointure de ta requête devrait donc être faite sur l'égalité de cet identifiant.
    Oui tout à fait mais non je ne peux pas modifier ça...

    En tous cas merci à tous de votre aide sur ce sujet.

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par captainKirk Voir le message
    Au risque de passer pour un vieux (j'ai que 32 ans ), si vous tenez absolument à utiliser l'ancienne norme, la syntaxe est de remplace le "=" dans le where par soit "*=", soit "=*" en fonction du coté vers lequel on souhaite avoir toutes les lignes.
    Ce que vous dites est stupide, car cela n'est valable que pour certains SGBDR et que pour des versions très anciennes ! (SQL Server 200 et avant, Sybase 9 et avant) et en plus c'est mathématiquement faux !
    Lisez l'article que j'ai écrit à ce sujet : http://blog.developpez.com/sqlpro/p5...-et-le-nouvea/

    Bon certains vont encore me mettre des pouces vers le bas...

    C'est incroyable de voir que lorsque l'on dit la vérité on est vilipendé, tandis que lorsque certains sortent de grosses bêtises... Tout va bien !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2009
    Messages : 90
    Points : 214
    Points
    214
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Ce que vous dites est stupide
    Merci ça fait super plaisir.

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

Discussions similaires

  1. Requête Select sur deux tables. need help
    Par Ma2x. dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/12/2009, 15h10
  2. Requête "select" sur deux tables dont une vide
    Par Torgar dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/10/2009, 09h27
  3. SELECT sur deux tables
    Par Gaetch dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/07/2007, 15h40
  4. Select sur deux tables
    Par DJuL- dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/03/2007, 14h40
  5. [SQL] Problème avec script de pagination et requête sql sur deux tables
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/06/2006, 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