Je veux afficher la liste des employés (MAT,NOM) qui ont travaillé au moins dans deux services
Version imprimable
Je veux afficher la liste des employés (MAT,NOM) qui ont travaillé au moins dans deux services
C'est pas forcément le plus optimiser ni le plus propre, mais ca devrait fonctionner.Code:
1
2
3
4
5
6
7
8
9
10
11 select MAT, NOM from EMPLOYE where exists ( select 1 from AFFECTATION AFF1 inner join AFFECTATION AFF2 on AFF1.MAT# = AFF2.MAT# and AFF1.CODE_SER# <> AFF2.CODE_SER# where AFF1.MAT# = MAT ) ;
Bonjour,
Ca sent tout de même une demande de solution pour un exercice...
Et si tu nous montrait plutôt ce que tu as tenté de faire, histoire qu'on te donne des pistes à creuser ?
Le but d'un forum comme celui-ci n'est pas de faire les devoirs des autres, il me semble...
Tatayo.
Je suis d'accord avec toi, mais ca ne me pose pas particulièrement de problème d'éthique lol ^^
dès lors que ca m'amuse d'écrire une minuscule requête, ca me gène pas de le faire.
Après, l'auteur s'arrange avec sa conscience, et surtout, s'arrange avec ses futures compétences professionnelles. :ptdr:
Mais la prochaine fois, je penserai à balancer un easter egg dans les requêtes que je ponds, c'est une bonne idée pour voir si la personne comprend qlq chose ou si elle recopie betement.
Bonjour,
@bstevy ta solution est de mon point de vue "surprenante"
ayant été prof dans un passé lointain, ce devoir m'aurait mis la puce à l'oreille et j'aurais senti la "triche" :roll:
une solution à base de GROUP BY/HAVING mâtinée d'une petite jointure m'aurait suffit je pense ;)
j'aimerais bien voir ça :lol:
Bonjour ,
Merci pour vos réponses , en effet mon prof nous a envoyé la correction mais j'ai pas compris son raisonnement donc j'ai voulu voir d'autres version pour faire une comparaison afin de comprendre . Enfin je vous montre la correction dans la figure ci-dessous ,
et voila mon essai :
Pièce jointe 177873Code:
1
2
3
4 Select Mat, Nom From employe , affectation where employe.Mat = affectation.Mat Having ( count(*) from affectation > 2 )
Tu diras à ton prof de notre part que depuis le siècle dernier les jointures s'écrivent en utilisant l'opérateur JOIN. :rouleau:
ma réponse est-elle correcte ?
Si tu as essayé de l'exécuter avec un SGBD, tu sais déjà qu'elle est incorrecte.
Où est la clause GROUP BY ?
et bien sur j'abonde dans le sens de al1_24 un JOIN bien écrit serait un plus
Je n'avais pas fait attention mais la clause GROUP BY est aussi absente de la correction :roll:
Rassure-moi : ce n'est pas une formation diplômante, avec des examens reconnus, que tu suis ?
Si , mais le prof a pris son diplôme l'année dernière
bonjour,
ne s'exprime pas Having count(*) from affectation > 2 mais HAVING count(*) >= 2Citation:
qui ont travaillé au moins dans deux services
on peut aussi lire "au moins dans deux services" par "plus d'un service" donc HAVING count(*)>1
clôturons cette discussion par une solution partielle
Obtenir le nombre d'affectation par matricule
Obtenir les matricules ayant travaillé dans au moins 2 servicesCode:1. SELECT MAT,count(*) FROM AFFECTATION GROUP BY MAT
Obtenir le nom d'un matriculeCode:2. SELECT MAT FROM AFFECTATION GROUP BY MAT HAVING COUNT(*)>1
Combinons 2 et 3 , plusieurs solutions possibles, les plus élégantes à mon avis seraient celle-ciCode:3. SELECT A.MAT,E. NOM FROM AFFECTATION A INNER JOIN EMPLOYE E ON A.MAT=E.MAT
Notez que pour des raisons pratiques j'utilise des noms d'alias pour les tables
que j'ai mis la table AFFECTATION en premier dans la jointure parce que le "travail" se fait principalement sur cette dernière
Code:
1
2
3
4 SELECT A.MAT AS Merci,E.NOM AS developpez ,count(*) AS net FROM AFFECTATION INNER JOIN EMPLOYE E ON A.MAT=E.MAT // expression de Jointure GROUP BY MAT,NOM // expression de groupage HAVING COUNT(*) >1 // sélection de résultat
Code:
1
2
3
4
5
6 // en utilisant une sous-requête telle que défini dans la norme SQL-99 WITH T AS (SELECT MAT,COUNT(*) AS N FROM AFFECTATION GROUP BY MAT) // obtenir le nombre d''affectations par matricule 1 SELECT T.MAT AS Merci,E.NOM as developpez,T.N AS net FROM T INNER JOIN EMPLOYE E ON t.MAT=E.MAT // faire la jointure 2 WHERE T.N>1 // au moins 2 , c.a.d plus d'une affectation