Oracle Discoverer - 单个 Table 上的多个连接
Oracle Discoverer - Multiple Join On Single Table
我在数据库 table 的业务区域下定义了两个文件夹,分别名为 EMP
和 PROJECTS
EMP
table 有以下列
emp_number
emp_name
projects
table 有以下列
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 中,当我尝试创建报告时,我能够看到
发起人的员工姓名 (initiated_by)
但是对于 started_by 和 closed_by,我不确定如何显示启动和关闭项目的员工姓名。
employee name of person who started (started_by)
employee name of person who started (closed_by)
感谢对此的任何帮助
您可以制作 2 种变体:
加入 emp 到每个人 - 所以 3 加入
在 select 五个部分
中创建一些功能或(select emp_name from emp where emp_number = ...)
我不熟悉您可能正在使用的 特定 报告工具,但我可以说编写 SQL 查询当然没问题 (或者,让报告引擎为您编写一个...),其中包含对同一 table(例如 EMP
)的多个引用。
</p>
<pre><code> 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
) 来 "disambiguate" 这两个不同且不相关的引用 table emp
. (对于 projects
table 两者都是 JOINed
。)我还使用 AS
为结果赋予不同的列名。
另外: 我在这里选择使用 INNER JOIN
,而不是 LEFT OUTER JOIN
。因此,此查询将仅 return 个同时具有启动器和启动器的项目。这是一个武断的选择,也许是一个不合适的选择。如果我选择使用 LEFT OUTER JOIN
,每个项目都会列出,但 initiated_by_name
and/or started_by_name
可能是 NULL
,并且结果集会更大。
如果此报告工具正在为您创建 SQL 查询,您会发现(可能在深入了解 "advanced" 用户手册的部分)它 将 有一些方法来创建这样的查询。 (包括各种类型JOINs
。)
为了实现以下
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的三个对象table和create join for
projects.proj_initiated_by = emp1.emp_number
projects.proj_started_by = emp2.emp_number
projects.proj_closed_by = emp3.emp_number
我在数据库 table 的业务区域下定义了两个文件夹,分别名为 EMP
和 PROJECTS
EMP
table 有以下列
emp_number
emp_name
projects
table 有以下列
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 中,当我尝试创建报告时,我能够看到 发起人的员工姓名 (initiated_by)
但是对于 started_by 和 closed_by,我不确定如何显示启动和关闭项目的员工姓名。
employee name of person who started (started_by)
employee name of person who started (closed_by)
感谢对此的任何帮助
您可以制作 2 种变体:
加入 emp 到每个人 - 所以 3 加入
在 select 五个部分
我不熟悉您可能正在使用的 特定 报告工具,但我可以说编写 SQL 查询当然没问题 (或者,让报告引擎为您编写一个...),其中包含对同一 table(例如 EMP
)的多个引用。
</p>
<pre><code> 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
) 来 "disambiguate" 这两个不同且不相关的引用 table emp
. (对于 projects
table 两者都是 JOINed
。)我还使用 AS
为结果赋予不同的列名。
另外: 我在这里选择使用 INNER JOIN
,而不是 LEFT OUTER JOIN
。因此,此查询将仅 return 个同时具有启动器和启动器的项目。这是一个武断的选择,也许是一个不合适的选择。如果我选择使用 LEFT OUTER JOIN
,每个项目都会列出,但 initiated_by_name
and/or started_by_name
可能是 NULL
,并且结果集会更大。
如果此报告工具正在为您创建 SQL 查询,您会发现(可能在深入了解 "advanced" 用户手册的部分)它 将 有一些方法来创建这样的查询。 (包括各种类型JOINs
。)
为了实现以下
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的三个对象table和create join for
projects.proj_initiated_by = emp1.emp_number
projects.proj_started_by = emp2.emp_number
projects.proj_closed_by = emp3.emp_number