Oracle Discoverer - несколько соединений на одной таблице

У меня есть две папки, определенные в бизнес-области из таблиц базы данных под названием EMP а также PROJECTS

EMP таблица имеет следующие столбцы

emp_number
emp_name

projects таблица имеет следующие столбцы

proj_id
proj_initiated_by
proj_started_by
proj_closed_by

Объединения создаются как

emp.emp_number -> projects.proj_initiated_by (one_to_many)
emp.emp_number -> projects.proj_started_by (one_to_many)
emp.emp_number -> projects.proj_closed_by (one_to_many)

В Discoverer Desktop, когда я пытаюсь создать отчет, я вижу имя сотрудника, который инициировал (init_by)

Однако для start_by и closed_by я не уверен, как отобразить имя сотрудника человека, который начал и закрыл проект.

employee name of person who started (started_by)    
employee name of person who started (closed_by)

Ценю любую помощь по этому вопросу

3 ответа

Решение

Для достижения ниже

emp.emp_number -> projects.proj_initiated_by (one_to_many)
emp.emp_number -> projects.proj_started_by (one_to_many)
emp.emp_number -> projects.proj_closed_by (one_to_many)

это создать три объекта таблицы emp и создать соединение для

projects.proj_initiated_by = emp1.emp_number 
projects.proj_started_by = emp2.emp_number 
projects.proj_closed_by = emp3.emp_number

Вы можете сделать это в 2 вариантах:
присоединяйся к emp каждому человеку - так 3 присоединения
сделать некоторую функцию или (выбрать emp_name из emp, где emp_number = ...) внутри селективной части

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

  SELECT i.emp_name AS initiated_by_name, 
         s.emp_name AS started_by_name,
         p.project_d
  FROM projects p
    INNER JOIN emp i ON (i.emp_number = p.proj_initiated_by)
    INNER JOIN emp s ON (s.emp_number = p.proj_started_by)

Обратите внимание, как я использовал псевдонимы (i, s, p) "устранить неоднозначность" двух разных и не связанных между собой ссылок на таблицу emp, (И к projects стол, к которому относятся оба JOINed.) Я также использовал AS дать различные имена столбцов для результатов.

Также: я решил использовать INNER JOIN здесь вместо LEFT OUTER JOIN, Таким образом, этот запрос вернет только те проекты, которые имеют как инициатора, так и стартера. Это был произвольный и, возможно, неуместный выбор. Если бы я решил использовать LEFT OUTER JOIN, каждый проект будет указан в списке, но initiated_by_name и / или started_by_name возможно NULL и набор результатов будет больше.

Если этот инструмент создания отчетов выполняет работу по созданию запросов SQL для вас, вы обнаружите (возможно, немного покопавшись в "расширенном" разделе руководства пользователя), что у него будут некоторые средства для создания запросов, подобных этому., (Включая различные типы JOINs.)

Другие вопросы по тегам