在本教學中,您將學習如何使用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自連線來查詢分層資料並比較同一個表中的行。