Partage
  • Partager sur Facebook
  • Partager sur Twitter

[ORACLE] Agregat et Jointure

Sujet résolu
    4 mai 2011 à 12:48:41

    Bonjour, j'ai un exercice de requête SQL en cours, et je bloque sur la dernière, pour commencer voici les tables,
    CREATE TABLE DEPT(
        Dno INTEGER, --Numéro du département
        Dnom VARCHAR(30) NOT NULL, --Nom du département
        Dir VARCHAR(30) NOT NULL, --Directeur du département
        Ville VARCHAR(30) NOT NULL, --Ville ou se situe le département
    
        CONSTRAINT DNO_PK PRIMARY KEY(Dno)
    );
    
    REATE TABLE EMP(
        Eno INTEGER, --Numéro d'identification de l'employé
        Enom VARCHAR(30) NOT NULL, --Nom de l'employé
        Prof VARCHAR(30) NOT NULL, --Proféssion
        Dateemb DATE NOT NULL, --Date d'embauche
        Sal INTEGER NOT NULL, --Salaire
        Comm INTEGER, --Commission sur ses ventes
        Dno INTEGER NOT NULL, --Département auquel il est assigné
    
        CONSTRAINT ENO_PK PRIMARY KEY(Eno),
        CONSTRAINT Salaire_CHECK CHECK(Salaire > 0),
        CONSTRAINT Comm_CHECK CHECK(Comm > 0),
        CONSTRAINT Dno_CHECK CHECK(Dno > 0),
        CONSTRAINT Dno_FK FOREIGN KEY(Dno) REFERENCES DEPT(Dno)
    );
    


    Voici la requête : Donner les noms des employés ayant le salaire maximum de chaque département.

    J'ai penser à un truc du genre :
    SELECT E.enom "Nom", MAX(E.sal) "Salaire MAX", D.dnom "Departement"
    FROM emp E, dept D
    WHERE E.dno = D.dno
    GROUP BY E.enom, D.dnom
    


    Mais cette requête me renvoi tous les employés avec leur salaire, donc j'ai voulu rajouter une clause HAVING comme ceci :
    SELECT E.enom "Nom", MAX(E.sal) "Salaire MAX", D.dnom "Departement"
    FROM emp E, dept D
    WHERE E.dno = D.dno
    GROUP BY E.enom, D.dnom
    HAVING MAX(sal)
    


    Le problème c'est que apparemmentle MAX dans HAVING ne fonctionne pas de cette façon et j'arrive pas a voir comment faire la jointure entre salaire MAX et departement, j'ai essayé avec des requête imbriquées mais j'ai échoué aussi.
    • Partager sur Facebook
    • Partager sur Twitter
      4 mai 2011 à 15:05:33

      Il faut seulement grouper par département, pas par employé.

      Le HAVING MAX(sal) ne sert strictement à rien ici, essaye de revoir à quoi ça sert et comment on l'utilise.
      Sinon la façon dont tu fais la jointure est dépréciée. Tu as déjà eu l'occasion de voir la clause JOIN ?
      • Partager sur Facebook
      • Partager sur Twitter
        8 mai 2011 à 5:14:20

        Salut Fab,
        Je viens juste de tombé sur ton sujet. J'ai pas tes tables, mes je penses qu'en faisant quelque chose du genre :

        SELECT ENOM
        FROM EMP E
        WHERE SAL = (SELECT MAX(SAL)
                     FROM EMP EE
                     WHERE EE.DNO = E.DNO);
        


        Sa peut le faire...Tiens nous au courant

        Enjoy, El - Key
        • Partager sur Facebook
        • Partager sur Twitter
          8 mai 2011 à 20:28:47

          Non, ça ne le fera pas.
          • Partager sur Facebook
          • Partager sur Twitter
            8 mai 2011 à 21:32:57

            En faite j'ai trouvé la solution mais j'ai oublié de mettre le sujet en résolu ça donne ça :

            SELECT enom
            FROM emp
            WHERE (dno, sal) IN(SELECT dno, MAX(SAL)
                                FROM emp
                                GROUP BY dno);
            
            • Partager sur Facebook
            • Partager sur Twitter

            [ORACLE] Agregat et Jointure

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown