Как работает Subquery в select statement в oracle

Я просмотрел все объяснения, как работает подзапрос в выражении select, и я все еще не могу понять концепцию из-за очень неопределенных объяснений.

Я хотел бы знать, как вы используете подзапрос в выражении select в oracle и что именно он выводит.

Например, если у меня был запрос, который хотел отобразить имена сотрудников и количество профилей, которыми они управляют из этих таблиц

Сотрудник (EmpName, EmpId)

Профиль (ProfileId,..., EmpId)

как использовать подзапрос?

Я думал, что в предложении select требуется подзапрос, чтобы реализовать группу по функции, чтобы подсчитать количество профилей, управляемых для каждого сотрудника, но я не уверен.

Ответ 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 по подзапросам и левое соединение или левое внешнее соединение.

Ответ 2

В СУБД Oracle можно использовать многорядный подзапрос в предложении select, пока (суб) вывод инкапсулируется как коллекция. В частности, подзапрос предложения нескольких строк select может выводить каждую из своих строк в виде xmlelement, который инкапсулирован в xmlforest.