详解 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>


总之自连接就是利用一张表的不同别名来标识在查询中每次对表的引用。

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