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
.)