詳解 Oracle 自連接


自連接是對同一個表進行的連接。使用自連接可以將自身表的一個鏡像當作另一個表來對待,從而能夠得到一些特殊的數據。


這裏用一個例子說明


首先來看一個表

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
1
SmithCEO
21JohnsonSales Manager
32HobbsSalesperson


m表

employee_idmanager_idlast_nametitle
1
SmithCEO
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>


總之自連接就是利用一張表的不同別名來標識在查詢中每次對錶的引用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章