Oracle Discoverer - 单个表上的多个联接

时间:2015-05-07 14:37:52

标签: oracle business-intelligence discover

我在数据库表的业务范围下定义了两个文件夹,名为EMPPROJECTS

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中,当我尝试创建报告时,我能够看到 发起人员的姓名(initiate_by)

但是对于started_by和closed_by,我不知道如何显示启动和关闭项目的人员的姓名。

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

感谢您对此的任何帮助

3 个答案:

答案 0 :(得分:2)

为了实现以下目标

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

答案 1 :(得分:1)

您可以使用2种变体: 加入每个人 - 所以3加入
在选择性部分

中创建一些函数或(从emp选择emp_name,其中emp_number = ...)

答案 2 :(得分:1)

我不熟悉您可能正在使用的特定报告工具,但我可以说编写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)

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) 请注意我如何使用别名(is)来消除歧义"对表p的两个不同且无关的引用。 (以及两者都为emp的{​​{1}}表。)我还使用projects为结果指定了不同的列名。

另外:我选择在此使用JOINed,而不是AS。因此,此查询将仅返回同时具有启动器和启动器的项目。这是一个随意的选择,也许是一个不合适的选择。如果我选择使用INNER JOIN,则会列出每个项目,但LEFT OUTER JOIN和/或LEFT OUTER JOIN可能是initiated_by_name,结果集会更大。

如果此报告工具正在为您创建SQL查询,您会发现(可能在稍微深入了解用户的" advanced" 部分之后) - 手动)它有一些创建像这样的查询的方法。 (包括各种类型的started_by_name。)