Het is eenvoudig-
SELECT empname,
empid,
(SELECT COUNT (profileid)
FROM profile
WHERE profile.empid = employee.empid)
AS number_of_profiles
FROM employee;
Het is nog eenvoudiger als je een table join als volgt gebruikt:
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;
Uitleg voor de subquery:
In wezen een subquery in een select
krijgt een scalaire waarde en geeft deze door aan de hoofdquery. Een subquery in select
mag niet meer dan één rij en meer dan één kolom passeren, wat een beperking is. Hier passeren we een count
naar de hoofdquery, die, zoals we weten, altijd alleen een getal zou zijn - een scalaire waarde. Als er geen waarde wordt gevonden, retourneert de subquery null
naar de hoofdvraag. Bovendien heeft een subquery toegang tot kolommen van de from
clausule van de hoofdquery, zoals getoond in mijn query waar employee.empid
wordt doorgegeven van de buitenste vraag naar de binnenste vraag.
Bewerken :
Wanneer u een subquery gebruikt in een select
clausule, behandelt Oracle het in wezen als een left join (u kunt dit zien in het uitlegplan voor uw query), waarbij de kardinaliteit van de rijen slechts één aan de rechterkant is voor elke rij aan de linkerkant.
Uitleg voor de linker join
Een left join is erg handig, vooral als je de select
. wilt vervangen subquery vanwege de beperkingen. Er zijn hier geen beperkingen voor het aantal rijen van de tabellen aan weerszijden van de LEFT JOIN
zoekwoord.
Lees voor meer informatie Oracle Docs over subquery's en left join of left outer join.