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 08/12/2010, 18h09   #1
Nouveau Membre du Club
 
Inscription : juillet 2009
Messages : 147
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 147
Points : 29
Points : 29
Par défaut Souci requête sql !

Bonjour,

je débute en sql et j'ai un petit souci pour répondre à une requête alors si quelqu'un pourrait m'aider ca serait vraiment cool.

Alors voila, j'ai les tables suivantes (je ne met pas les autres elle serait inutiles pour ma requete je pense) :
 Chercheur [ CodeCh, NomCh, CodeEq* ]
 Equipe [ CodeEq, NomEq, CodeResp*, CodeLabo* ]

Je souhaiterai restituer les chercheurs travaillant dans la meme equipe que le chercheur eric.

Voici ce que j'ai fais mais je ne comprends pas pourquoi ca ne me retourne pas ce que je voudrai.
Code :
1
2
3
4
SELECT NomCh
FROM Chercheur, Equipe
WHERE Chercheur.CodeEq=Equipe.CodeEq
AND NomCh='Eric' ;
Lenou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 18h20   #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 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Vous pouvez utiliser deux fois la même table dans la requête :
Code :
1
2
3
4
5
SELECT C2.NomCh
  FROM Chercheur C1
       INNER JOIN Chercheur C2
         ON C2.CodeEq = C1.CodeEq
 WHERE C1.NomCh = 'Eric';
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 19h05   #3
Nouveau Membre du Club
 
Inscription : juillet 2009
Messages : 147
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 147
Points : 29
Points : 29
Merci mais n'y aurait-il pas plus simple étant donné que je suis débutante en la matière.
Une requête simple voire imbriquée m'irait
Lenou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 19h08   #4
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 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Plus simple qu'une jointure ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 19h12   #5
Nouveau Membre du Club
 
Inscription : juillet 2009
Messages : 147
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 147
Points : 29
Points : 29
J'aimerai ne pas utiliser le INNER JOIN ..... ON
je ne connais pas du tout

Comment faire plus simplement ?
Lenou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 19h27   #6
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 972
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 972
Points : 5 947
Points : 5 947
Bonsoir.

Citation:
Envoyé par Lenou Voir le message
J'aimerai ne pas utiliser le INNER JOIN ..... ON
je ne connais pas du tout

Comment faire plus simplement ?
C'est pourtant recommandé depuis SQL 92 ... il n'y a rien de plus compliqué que dans la syntaxe SQL 89 que vous utilisez.

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2010, 19h56   #7
Membre expérimenté
 
Inscription : octobre 2002
Messages : 654
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 654
Points : 552
Points : 552
Bonjour,
Concernant ta méconnaissance des INNEr join regarde ici
http://sqlpro.developpez.com/cours/sqlaz/jointures/

La requete pourrait s'écrire comme cela
Code :
1
2
3
4
5
6
7
 
SELECT C2.NomCh
  FROM Chercheur C1,
	Chercheur C2        
 WHERE 
 C2.CodeEq = C1.CodeEq
AND C1.NomCh = 'Eric';
mais je rejoins mes camarades, cela fait mal aux yeux.
Donc en pratique, tu sépares tes tables par inner join à la place de,
et ton critère de jointure C2.CodeEq = C1.CodeEq tu le mets derrière le ON.

SQLPRO explique très bien les jointures, bonne lecture.
Soazig
soazig est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/12/2010, 23h35   #8
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

avec une requete imbriquée, ca donne :

Code sql :
1
2
3
4
5
6
7
8
 
SELECT NomCH
FROM Chercheur
WHERE CodeEq = (
    SELECT CodeEq
    FROM Chercheur
    WHERE NomCh = 'Eric'
)

en supposant que deux chercheurs ne peuvent avoir le meme nom, et que donc vous avez une contrainte d'unicité sur NomCh
sinon, il faudra remplacer le = par un IN pour ne pas vous faire insulter par votre SGBDR au cas ou la sous requete renvoi plusieurs resultats
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2010, 09h23   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 968
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 : 10 968
Points : 18 200
Points : 18 200
Envoyer un message via MSN à CinePhil
La requête imbriquée est une moins bonne solution que la jointure car la jointure est l'opération la plus optimisée dans un SGBD.
__________________
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 09/12/2010, 10h24   #10
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par CinePhil Voir le message
La requête imbriquée est une moins bonne solution que la jointure car la jointure est l'opération la plus optimisée dans un SGBD.
oui sur le plan théorique. mais je pense qu'il vaut mieux écrire une requete que l'on comprend, qu'une requete optimisée


Citation:
Envoyé par Lenou Voir le message
J'aimerai ne pas utiliser le INNER JOIN ..... ON
je ne connais pas du tout

Comment faire plus simplement ?
surtout qu'a mon avis dans le cas présent, il n'y aura aucune différence notable de performance...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2010, 10h28   #11
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 968
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 : 10 968
Points : 18 200
Points : 18 200
Envoyer un message via MSN à CinePhil
Et moi je crois qu'il vaut mieux faire le petit effort de comprendre la jointure normalisée depuis 1992, surtout que je la trouve au moins aussi simple, voire plus simple à comprendre que l'ancienne syntaxe.
__________________
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 09/12/2010, 10h32   #12
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 972
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 972
Points : 5 947
Points : 5 947
Citation:
Envoyé par aieeeuuuuu Voir le message
oui sur le plan théorique. mais je pense qu'il vaut mieux écrire une requete que l'on comprend, qu'une requete optimisée
Les jointures sont une notion de base ... mieux vaut essayer de comprendre cette notion que de palier au problème avec une imbrication tordue je pense.

On fait des imbrications quand on a pas d'autres choix (pour comparer des COUNT par exemple).

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2010, 10h58   #13
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par CinePhil Voir le message
Et moi je crois qu'il vaut mieux faire le petit effort de comprendre la jointure normalisée depuis 1992, surtout que je la trouve au moins aussi simple, voire plus simple à comprendre que l'ancienne syntaxe.
tout à fait d'accord avec ca...

cependant l'auto-jointure ne me semble pas la chose la plus simple pour apprendre... la jointure

j'ai donc proposé ce code qui se rapproche de la requete originale de Lenou pour qu'il comprenne son erreur, car il y a une grosse erreur de logique dans sa requete.

petit a petit l'oiseau fait son nid

mais sinon je le redis, je suis tout a fait d'accord avec toi : ta requete est mieux écrite, plus optimisée...

PS : Lenou, ta requete initiale avec une jointure s'ecrit :
Code sql :
1
2
3
4
5
 
SELECT NomCh
FROM Chercheur
INNER JOIN Equipe ON Chercheur.CodeEq=Equipe.CodeEq
WHERE NomCh='Eric' ;

c'est donc effectivement pas très compliqué, plus lisible/comprehensible et optimisé...
mais cela n'enlève pas l'erreur de logique dans le filtre et ne te donne donc pas ce que tu veux...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2010, 14h46   #14
Nouveau Membre du Club
 
Inscription : juillet 2009
Messages : 147
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 147
Points : 29
Points : 29
Merci beaucoup pour toutes vos explications, cela m'a bien aidéé.
Lenou est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h39.


 
 
 
 
Partenaires

Hébergement Web