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.