Това е просто-
SELECT empname,
empid,
(SELECT COUNT (profileid)
FROM profile
WHERE profile.empid = employee.empid)
AS number_of_profiles
FROM employee;
Още по-лесно е, когато използвате присъединяване на таблица по следния начин:
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;
Обяснение за подзаявката:
По същество подзаявка в select
получава скаларна стойност и я предава на основната заявка. Подзаявка в select
не е разрешено да преминава повече от един ред и повече от една колона, което е ограничение. Тук предаваме count
към основната заявка, която, както знаем, винаги би била само число - скаларна стойност. Ако стойност не бъде намерена, подзаявката връща null
към основната заявка. Освен това подзаявката може да има достъп до колони от from
клауза на основната заявка, както е показано в моята заявка, където employee.empid
се предава от външната заявка към вътрешната.
Редактиране :
Когато използвате подзаявка в select
клауза, Oracle по същество го третира като ляво присъединяване (можете да видите това в плана за обяснение на вашата заявка), като кардиналността на редовете е само един вдясно за всеки ред вляво.
Обяснение за лявото присъединяване
Лявото присъединяване е много удобно, особено когато искате да замените select
подзаявка поради нейните ограничения. Тук няма ограничения за броя на редовете на таблиците от двете страни на LEFT JOIN
ключова дума.
За повече информация прочетете Oracle Docs относно подзаявките и лявото присъединяване или лявото външно присъединяване.