ORACLE: Как массово собрать мастер и детали в одном запросе? - PullRequest
0 голосов
/ 06 ноября 2019

Допустим, у нас есть обычные таблицы сотрудников и отделов Oracle.

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

  • TEmployee: тип объекта, имеющий те же члены, что и поляв таблице Сотрудники.
  • TEmployeeList: таблица объектов TEmployee.
  • TDepartment: тип объекта, который имеет те же члены, что и поля в таблицах Отделов.
  • 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;

1 Ответ

0 голосов
/ 06 ноября 2019

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

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) - это то, что я добавил.

...