ORACLE: Как массово собирать мастер и детали в одном запросе?

Допустим, у нас есть обычные таблицы Oracle Employees и Departments.

У меня также есть некоторые типы объектов Oracle:

  • TEmployee: тип объекта, который имеет те же члены, что и поля в Table Employees.
  • TEmployeeList: таблица объектов TEmployee.
  • TDepartment: тип объекта, который имеет те же члены, что и поля в Table Departments.
  • В TDepartment также есть член «сотрудники» типа TEmployeeList. TDepartmentList: таблица объектов TDepartment.

Теперь я хочу массово собрать несколько отделов с их сотрудниками в одном запросе.

Я знаю, как массово собирать отделы без сотрудников:

DECLARE
  departmentList TDepartmentList;
BEGIN

  SELECT TDepartment(dept.id, dept.name)
  BULK COLLECT INTO departmentList
  FROM departments dept
  WHERE <some condition>;

END;

Но как собрать в одном запросе сотрудников выбранных отделов?

Таким образом, что-то вроде

DECLARE
  departmentList TDepartmentList;
BEGIN

  SELECT TDepartment(dept.id, dept.name,
          SELECT TEmployee(emp.id, emp.name)
          FROM Employees
          WHERE emp.deptId = dept.id
  )
  BULK COLLECT INTO departmentList
  FROM departments dept
  WHERE <some condition>;

END;

person mvermand    schedule 06.11.2019    source источник


Ответы (1)


Хорошо, я нашел это:

DECLARE
  departmentList TDepartmentList;
BEGIN

  SELECT TDepartment(dept.id, dept.name,
      CAST(MULTISET(
          SELECT TEmployee(emp.id, emp.name)
          FROM Employees
          WHERE emp.deptId = dept.id
      ) AS TEmployeeList))
  )
  BULK COLLECT INTO departmentList
  FROM departments dept
  WHERE <some condition>;

END;

Итак, я добавил CAST(MULTISET( query ) AS TEmployeeList).

person mvermand    schedule 06.11.2019