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 :

Encore un pbm sur Max


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 18
    Points : 17
    Points
    17
    Par défaut Encore un pbm sur Max
    Bonjour,
    j ai deja pas mal cherché sur les precedents post contenant du "Max" et j ai trouvé plusieurs chose qui m'ont mené a ce qui devrait être la solution à mon problème et qui pourtant ne fonctionne pas.
    Aucune erreure, simplement le résultat de ma requete est vide:
    J'ai 3 tables, une table d'élèves, une tables de responsable, et une table qui fait le lien entre les responsables et les élèves, sachant qu'un élève n'a qu'un et un seul responsable, et qu'un responsable peut avoir plusieurs élèves...

    Je cherche tout betement a avoir le nom responsable, prenom reponsable, nom élève, prenom élève de chaque responsable et de son élève le plus vieux. J'ai donc fais la requête suivante:
    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
    SELECT 
    	ELEV1.EL_NOM,	
    	ELEV1.EL_PRENOM,	
    	RESP1.RE_NOM,	
    	RESP1.RE_PRENOM,
    	ELEV1.IDELEVE,
    	RESP1.IDRESPONSABLE,
    	ELEV1.EL_AGE
    FROM 
    	COM_RESPONSABLES AS RESP1,	
    	COM_LIEN AS LIEN1,	
    	COM_ELEVES AS ELEV1
    WHERE 
    	RESP1.IDRESPONSABLE = LIEN1.IDRESPONSABLE
    	AND ELEV1.IDELEVE = LIEN1.IDELEVE
    	AND ELEV1.EL_AGE = (
    		SELECT
    			MAX(ELEV2.EL_AGE) AS AGE
    		FROM
    			COM_LIEN AS LIEN2,	
    			COM_ELEVES AS ELEV2
    		WHERE
    			ELEV2.IDELEVE = LIEN2.IDELEVE
    			AND LIEN2.IDRESPONSABLE=RESP1.IDRESPONSABLE
    		GROUP BY LIEN2.IDRESPONSABLE
    		)
    La requete ne plante pas mais ne retourne aucun resulat... des idées?

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 400
    Points
    28 400
    Par défaut
    En utilisant une syntaxe standard pour les jointures, tu peux mieux voir ce qui ressort du filtre :
    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
    SELECT 
        elev1.el_nom	
      , elev1.el_prenom	
      , resp1.re_nom	
      , resp1.re_prenom
      , elev1.ideleve
      , resp1.idresponsable
      , elev1.el_age
    FROM 
        com_responsables AS resp1
    	INNER JOIN com_lien AS lien1
        ON 	resp1.idresponsable = lien1.idresponsable
    	INNER JOIN com_eleves AS elev1
        ON  elev1.ideleve = lien1.ideleve
    WHERE
        elev1.el_age = (
      		SELECT
              MAX(elev2.el_age) AS age
      		FROM
      			   com_lien AS lien2	
      			INNER JOIN com_eleves AS elev2
      			   ON	elev2.ideleve = lien2.ideleve
      		WHERE
              lien2.idresponsable=resp1.idresponsable
      		GROUP BY
              lien2.idresponsable
      		);
    Ta requête semble tout à fait correcte, si tu prévois bien qu'elle peut retourner plusieurs élèves pour un même professeur (cas où plusieurs élèves ont le même age, qui est le plus élevé)

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par al1_24
    Ta requête semble tout à fait correcte
    Avec, néanmoins, un GROUP BY inutile dans la sous-requête, mais cela ne devrait pas l'empêcher de marcher.

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 18
    Points : 17
    Points
    17
    Par défaut
    Effectivement il me semble bien que la requête est correcte... mais curieusement elle me retourne toujours une liste vide... enfin c est probablement dû au moteur de requete qui, bien qu'il accepte la syntaxe SQL, N EST PAS un vrai sql... bon... tant pis... je vais faire ca en version longue, merci pour les reponse

    (sinon, juste pour savoir, pourquoi le GROUP BY est inutil dans la sous requete?? il me semblait qu'en cas d'agrégas genre MAX il fallait absolument un group by...)

  5. #5
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par KamaShin
    (sinon, juste pour savoir, pourquoi le GROUP BY est inutil dans la sous requete?? il me semblait qu'en cas d'agrégas genre MAX il fallait absolument un group by...)
    Tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT MAX(laColonne) FROM laTable
    sans problème, et pourtant il n'y a pas de GROUP BY.

    Ici il y a à la fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lien2.idresponsable=resp1.idresponsable
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY lien2.idresponsable
    ce qui veut dire que lien2.idresponsable ne peut prendre qu'une seule valeur, regrouper dessus revient à tout prendre, donc pas besoin de GROUP BY.

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 400
    Points
    28 400
    Par défaut
    Citation Envoyé par KamaShin
    (sinon, juste pour savoir, pourquoi le GROUP BY est inutil dans la sous requete?? il me semblait qu'en cas d'agrégas genre MAX il fallait absolument un group by...)
    Le GROUP BY n'est pas indispensable. Sans lui, le regroupement s'effectue sur l'intégralité de l'ensemble de données, qui dans ton cas est déjà filtré sur lien2.idresponsable=resp1.idresponsable.
    Toutefois, certains optimiseurs de requêtes "paresseux" apprécieront de l'avoir et prépareront un plan d'exécution plus performant, ou au contraire ajouteront une passe au traitement.
    A tester...

Discussions similaires

  1. Requête avec sélection sur MAX et Rupture par Service
    Par Kmiecik Sigismond dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/04/2006, 14h00
  2. pbm sur requete facile
    Par soony dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/08/2005, 16h24
  3. [langage] Encore 2 questions sur perl
    Par nico72 dans le forum Langage
    Réponses: 6
    Dernier message: 02/08/2004, 22h52
  4. Encore une question sur malloc
    Par IG88 dans le forum C
    Réponses: 5
    Dernier message: 23/06/2004, 15h35

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