Cette requête ne correspond à aucun élément connu de SQL. Elle est donc fausse. D'ou tirez vous
rownum ?
Sachez en outre que la claude ORDER BY est illicite dans les sous requêtes.
Enfin même dans le cas fortuit ou elle marcherait dans un SGBDR faisant du grand n'importe quoi, elle est susceptible de donner de faux résultats.
Bref, une requête particulièrement imbécile, preuve que vous n'avez rien compris aux principes ensembliste qui sont le fondement des bases de données relationnelles.
Une solution simple, parmi d'autres est la suivante :
1 2 3 4 5 6 7 8 9
| SELECT Job_id
FROM Employee
GROUP BY Job_id
HAVING COUNT(*) = (SELECT MAX(N)
FROM (SELECT COUNT(*) AS N
FROM Employee
GROUP BY Job_id
) AS T
) |
Autre façon de faire, avec le quantificateur ALL :
1 2 3 4 5 6 7
| SELECT Job_id
FROM Employee
GROUP BY Job_id
HAVING COUNT(*) >= ALL (SELECT COUNT(*) AS N
FROM Employee
GROUP BY Job_id
) AS T |
Plus sophistiqué avec les fonctions de ranking (norme SQL:2003)
1 2 3 4 5
| SELECT Job_id
FROM (SELECT Job_id,
RANK() OVER (ORDER BY COUNT(*) DESC PARTITION BY Job_id) AS N
FROM Employee) AS T
WHERE N = 1 |
Enfin, pour expliquer pourquoi la requête qui vous a été donné est fausse, il suffit de prendre un exemple :
1 2 3 4 5 6 7 8 9 10 11 12
| INSERT INTO Employee (Employee_id , Job_id)
VALUES (1, 100);
INSERT INTO Employee (Employee_id , Job_id)
VALUES (2, 100);
INSERT INTO Employee (Employee_id , Job_id)
VALUES (3, 200);
INSERT INTO Employee (Employee_id , Job_id)
VALUES (4, 200);
INSERT INTO Employee (Employee_id , Job_id)
VALUES (5, 300);
INSERT INTO Employee (Employee_id , Job_id)
VALUES (6, 400); |
Dans votre cas la requête pondue donnera arbitrairement le job id 100 ou 200 (indéterminisme) puisqu'ils ont le même nombre d'employé et que c'est bien le maximum.
Or en matière de SGBDR l'arbitraire ne peut exister !
Conclusion : apprenez le langage SQL et les principes des SGBRD. Mon site web, comme mes livres peuvent vous y aider !
A +
Partager