Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/06/2011, 19h05   #1
Candidat au titre de Membre du Club
 
Homme Laurent
Développeur informatique
Inscription : juin 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juin 2011
Messages : 4
Points : 11
Points : 11
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 :
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
Discretebal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 19h11   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 433
Points : 10 433
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Faites une petite recherche sur les jointures externes !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 06/06/2011, 20h19   #3
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est actuellement connecté   Envoyer un message privé Réponse avec citation 15
Vieux 07/06/2011, 10h12   #4
Candidat au titre de Membre du Club
 
Homme Laurent
Développeur informatique
Inscription : juin 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juin 2011
Messages : 4
Points : 11
Points : 11
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.
Discretebal est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 07/06/2011, 11h41   #5
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
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/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 07/06/2011, 12h54   #6
Membre habitué
 
Avatar de tfc3146
 
Homme Robert Labrousse
Développeur décisionnel
Inscription : février 2009
Messages : 79
Détails du profil
Informations personnelles :
Nom : Homme Robert Labrousse
Localisation : France

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

Informations forums :
Inscription : février 2009
Messages : 79
Points : 134
Points : 134
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 ?
__________________
Citation:
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
tfc3146 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/06/2011, 16h13   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 007
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 007
Points : 18 278
Points : 18 278
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 21
Vieux 10/06/2011, 16h52   #8
Membre actif
 
Benoit Rocco
Inscription : décembre 2009
Messages : 87
Détails du profil
Informations personnelles :
Nom : Benoit Rocco
Âge : 32
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : décembre 2009
Messages : 87
Points : 199
Points : 199
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 :
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
captainKirk est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 10/06/2011, 17h07   #9
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 433
Points : 10 433
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/06/2011, 17h14   #10
Membre actif
 
Benoit Rocco
Inscription : décembre 2009
Messages : 87
Détails du profil
Informations personnelles :
Nom : Benoit Rocco
Âge : 32
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : décembre 2009
Messages : 87
Points : 199
Points : 199
Ah désolé, ça c'est sous SQL Server
captainKirk est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/06/2011, 20h17   #11
Candidat au titre de Membre du Club
 
Homme Laurent
Développeur informatique
Inscription : juin 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juin 2011
Messages : 4
Points : 11
Points : 11
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 :
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 ?
Discretebal est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/06/2011, 22h27   #12
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 007
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 007
Points : 18 278
Points : 18 278
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/06/2011, 12h57   #13
Candidat au titre de Membre du Club
 
Homme Laurent
Développeur informatique
Inscription : juin 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juin 2011
Messages : 4
Points : 11
Points : 11
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 :
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.
Discretebal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/06/2011, 19h34   #14
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est actuellement connecté   Envoyer un message privé Réponse avec citation 32
Vieux 14/06/2011, 12h19   #15
Membre actif
 
Benoit Rocco
Inscription : décembre 2009
Messages : 87
Détails du profil
Informations personnelles :
Nom : Benoit Rocco
Âge : 32
Localisation : France, Hérault (Languedoc Roussillon)

Informations forums :
Inscription : décembre 2009
Messages : 87
Points : 199
Points : 199
Citation:
Envoyé par SQLpro Voir le message
Ce que vous dites est stupide
Merci ça fait super plaisir.
captainKirk est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h21.


 
 
 
 
Partenaires

Hébergement Web