C'est simple-
SELECT empname,
empid,
(SELECT COUNT (profileid)
FROM profile
WHERE profile.empid = employee.empid)
AS number_of_profiles
FROM employee;
C'est encore plus simple lorsque vous utilisez une jointure de table comme celle-ci :
SELECT e.empname, e.empid, COUNT (p.profileid) AS number_of_profiles
FROM employee e LEFT JOIN profile p ON e.empid = p.empid
GROUP BY e.empname, e.empid;
Explication de la sous-requête :
Essentiellement, une sous-requête dans un select obtient une valeur scalaire et la transmet à la requête principale. Une sous-requête dans select n'est pas autorisé à passer plus d'une ligne et plus d'une colonne, ce qui est une restriction. Ici, nous passons un count à la requête principale, qui, comme nous le savons, ne serait toujours qu'un nombre - une valeur scalaire. Si une valeur n'est pas trouvée, la sous-requête renvoie null à la requête principale. De plus, une sous-requête peut accéder aux colonnes du from clause de la requête principale, comme indiqué dans ma requête où employee.empid est passé de la requête externe à la requête interne.
Modifier :
Lorsque vous utilisez une sous-requête dans un select clause, Oracle la traite essentiellement comme une jointure gauche (vous pouvez le voir dans le plan d'explication de votre requête), la cardinalité des lignes étant juste une à droite pour chaque ligne à gauche.
Explication pour la jointure gauche
Une jointure à gauche est très pratique, surtout lorsque vous souhaitez remplacer le select sous-requête en raison de ses restrictions. Il n'y a aucune restriction ici sur le nombre de lignes des tables de part et d'autre du LEFT JOIN mot-clé.
Pour plus d'informations, lisez Oracle Docs sur les sous-requêtes et la jointure gauche ou la jointure externe gauche.