自連接配接是對同一個表進行的連接配接。使用自連接配接可以将自身表的一個鏡像當作另一個表來對待,進而能夠得到一些特殊的資料。
這裡用一個例子說明
首先來看一個表
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_idmanager_idlast_nametitle
1SmithCEO
21JohnsonSales Manager
32HobbsSalesperson
m表employee_idmanager_idlast_nametitle
1SmithCEO
21JohnsonSales Manager
32HobbsSalesperson
那麼上面的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>
總之自連接配接就是利用一張表的不同别名來辨別在查詢中每次對表的引用。