Ответ 1
Это просто -
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
передается из внешнего запроса во внутренний запрос.
Edit:
Когда вы используете подзапрос в предложении select
, Oracle по существу рассматривает его как левое соединение (это можно увидеть в плане объяснения для вашего запроса), при этом мощность строк будет равна одному справа для каждой строки слева.
Объяснение для левого соединения
Левое соединение очень удобно, особенно если вы хотите заменить подзапрос select
из-за его ограничений. Здесь нет ограничений на количество строк таблиц в каждой из сторон ключевого слова LEFT JOIN
.
Для получения дополнительной информации прочитайте Документы Oracle по подзапросам и левое соединение или левое внешнее соединение.