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自連接來查詢分層數據並比較同一個表中的行。


上一篇: Oracle笛卡爾連接 下一篇: Oracle All運算符