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