自連接是對同一個表進行的連接。使用自連接可以將自身表的一個鏡像當作另一個表來對待,從而能夠得到一些特殊的數據。
這裏用一個例子說明
首先來看一個表
SQL> SELECT employee_id,manager_id,last_name,title,salary 2 FROM employees; EMPLOYEE_ID MANAGER_ID LAST_NAME TITLE SALARY ----------- ---------- ---------- -------------------- ---------- 1 Smith CEO 800000 2 1 Johnson Sales Manager 600000 3 2 Hobbs Salesperson 150000 4 2 Jones Salesperson 500000 SQL>
那麼這個表主要記錄的是人事的一些資料,其中
第一列:人員的員工ID
第二列:所屬上級經理的ID
第三列:員工名字
第四列:員工的職位
第五列:員工薪水
那麼爲了直觀方便的看出某個員工被誰管理,或者是誰管理着某個員工,這時我們就會用到employee_id列和manager_id列
SQL語句如下:
SQL> SELECT w.last_name || ' works for ' || m.last_name 2 FROM employees w,employees m 3 WHERE w.manager_id = m.employee_id 4 ORDER BY w.last_name; W.LAST_NAME||'WORKSFOR'||M.LAST ------------------------------- Hobbs works for Johnson Johnson works for Smith Jones works for Johnson SQL>
執行結果正是我們想要的。
那麼到底如何理解呢?
前面講到使用自連接可以將自身表的一個鏡像當作另一個表來對待,從而能夠得到一些特殊的數據。
那麼在前面的SQL語句中的FROM子句中,將employees表用不同表別名的方法比喻成不同的表,以方便在查詢中使用不同的表別名來標識每次對錶的應用。注意,還是一個表,只是在邏輯上用表別名的方法比喻成了兩個表而已。
w表
employee_id | manager_id | last_name | title |
1 | Smith | CEO | |
2 | 1 | Johnson | Sales Manager |
3 | 2 | Hobbs | Salesperson |
m表
employee_id | manager_id | last_name | title |
1 | Smith | CEO | |
2 | 1 | Johnson | Sales Manager |
3 | 2 | Hobbs | Salesperson |
那麼上面的w表和m表就是利用表別名邏輯上的兩個表。
那麼再來看連接條件 w.manager_id = m.employee_id
比如w表的第二行Johnson的manager_id爲1 那麼 與這個匹配的就是 m表的Smith,因爲smith的employee_id爲1
所以按照格式輸出
格式爲: w.last_name ||
' works for '
|| m.last_name
Johnson works for Smith
上述例子是內連接和自連接的結合使用,只顯示了匹配的行,有空值的行並沒有顯示。
還可以使用外連接和自連接結合使用。
SQL> SELECT w.last_name || ' works for ' || 2 NVL(m.last_name,'the leader') 3 FROM employees w,employees m 4 WHERE w.manager_id = m.employee_id (+) 5 ORDER BY w.last_name; W.LAST_NAME||'WORKSFOR'||NVL(M. ------------------------------- Hobbs works for Johnson Johnson works for Smith Jones works for Johnson Smith works for the leader SQL>
這樣看起來是不是更加完美一點呢。
以上都是SQL/86的寫法
下面來看看SQL/92的寫法
SQL> SELECT w.last_name || ' works for ' || 2 NVL(m.last_name,'the leader') 3 FROM employees w INNER JOIN employees m 4 ON w.manager_id = m.employee_id; W.LAST_NAME||'WORKSFOR'||NVL(M. ------------------------------- Johnson works for Smith Hobbs works for Johnson Jones works for Johnson SQL>
總之自連接就是利用一張表的不同別名來標識在查詢中每次對錶的引用。