在本教程中,您将学习如何使用oracle自身连接将表连接到自身。
自连接是连接表与自身的连接。自连接对比较表中的行或查询分层数据非常有用。
自连接使用其他连接,如内连接和左连接。 另外,它使用表别名在同一查询中为表提供不同的名称。
请注意,在不使用表别名的情况下,在查询中多次引用同一个表会导致错误。
以下说明了表t
如何与自身连接:
select
column_list
from
t t1
inner join t t2 on
join_predicate;
请注意,除了inner join
之外,还可以在上面的语句中使用left join。
下面我们来看看在oracle中使用自连接的一些例子。
请参阅示例数据库中的以下employees
表。其er图如下所示 -
employees
表存储个人信息,如:编号,姓名,职务。 另外,它还有manager_id
列,用于存储员工之间的上级(报告人)行记录。
该公司总裁谁不向任何人报告,所以他的manager_id
列中是一个null
值。 其他拥有经理的员工在manager_id
列中有一个数字值,表示经理的id
。
要从employees
表中检索员工和经理数据,请使用以下语句中所示的自连接:
select
(e.first_name || ' ' || e.last_name) employee,
e.job_title,
(m.first_name || ' ' || m.last_name) manager
from
employees e
left join employees m on
m.employee_id = e.manager_id
order by
manager;
这个查询引用employees
表两次:一个是e
(对于员工),另一个是对m
(对于经理)。 连接谓词使用employee_id
和manager_id
列匹配员工和经理。
执行上面查询语句,得到以下结果 -
以下语句查找所有雇用日期相同(同一天入职)的员工:
select
(e1.first_name || ' ' || e1.last_name) employee1,
(e2.first_name || ' ' || e2.last_name) employee2,
to_char(e1.hire_date, 'yyyy-mm-dd') as hire_date
from
employees e1
inner join employees e2 on
e1.employee_id <> e2.employee_id
and e1.hire_date = e2.hire_date;
e1
和e2
是同一个employees
表的表别名。执行上面查询语句,得到以下结果 -
在本教程中,您学习了如何使用oracle自连接来查询分层数据并比较同一个表中的行。