天天看点

oracle语句 表自连接,详解 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

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>

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