Oracle自身连接

Oracle自身连接

在本教程中,您将学习如何使用Oracle自身连接将表连接到自身。

Oracle自连接简介

自连接是连接表与自身的连接。自连接对比较表中的行或查询分层数据非常有用。

自连接使用其他连接,如内连接左连接。 另外,它使用表别名在同一查询中为表提供不同的名称。

请注意,在不使用表别名的情况下,在查询中多次引用同一个表会导致错误。

以下说明了表T如何与自身连接:

SELECT
    column_list
FROM
    T t1
INNER JOIN T t2 ON
    join_predicate;

请注意,除了INNER JOIN之外,还可以在上面的语句中使用LEFT JOIN

Oracle自连接示例

下面我们来看看在Oracle中使用自连接的一些例子。

1. 查询分层数据示例

请参阅示例数据库中的以下employees表。其ER图如下所示 -

Oracle自身连接

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_idmanager_id列匹配员工和经理。

执行上面查询语句,得到以下结果 -

自连接示例

2. 比较表中的行的示例

以下语句查找所有雇用日期相同(同一天入职)的员工:

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;

e1e2是同一个employees表的表别名。执行上面查询语句,得到以下结果 -

比较表中的行

在本教程中,您学习了如何使用Oracle自连接来查询分层数据并比较同一个表中的行。