È semplice-
SELECT empname,
empid,
(SELECT COUNT (profileid)
FROM profile
WHERE profile.empid = employee.empid)
AS number_of_profiles
FROM employee;
È ancora più semplice quando usi un join di tabella come questo:
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;
Spiegazione per la sottoquery:
In sostanza, una sottoquery in un select
ottiene un valore scalare e lo passa alla query principale. Una sottoquery in select
non è consentito passare più di una riga e più di una colonna, il che è una restrizione. Qui stiamo passando un count
alla query principale, che, come sappiamo, sarebbe sempre solo un numero, un valore scalare. Se non viene trovato un valore, la sottoquery restituisce null
alla domanda principale. Inoltre, una sottoquery può accedere alle colonne da from
clausola della query principale, come mostrato nella mia query dove employee.empid
viene passato dalla query esterna alla query interna.
Modifica :
Quando utilizzi una sottoquery in un select
clausola, Oracle essenzialmente lo tratta come un join sinistro (puoi vederlo nel piano di spiegazione della tua query), con la cardinalità delle righe che è solo una a destra per ogni riga a sinistra.
Spiegazione per il join sinistro
Un left join è molto utile, specialmente quando vuoi sostituire il select
subquery a causa delle sue restrizioni. Non ci sono restrizioni qui sul numero di righe delle tabelle in entrambi i lati di LEFT JOIN
parola chiave.
Per ulteriori informazioni, leggi Oracle Docs su subquery e left join o left outer join.