时间给了够幸福的结局

Oracle外连接

今天开发过程中,遇到了一个多条件外连接的问题,最后因为外连接的局限性,只好通过把其中不需要外连接的条件SELECT出来以减少连接条件的方法来解决。借此机会总结一下外连接。

Oracle官方提供了两种方式来实现外连接,一种是在where子句中使用Join操作符(+),另一种是在from子句中使用left outer join/right outer join/full outer join。第二种方式是通用的,也是Oracle官方建议的:Oracle recommends that you use the FROM clause OUTER JOIN syntax rather than the Oracle join operator;而第一种方式只能用在Oracle数据库中,并且包含(+)的where子句中不可以用or、in和子查询。

1. 左/右/全外连接的简单用法

(1)左外连接

右条件所在的表必须严格进行相等连接条件的匹配,而左条件所在的表除了匹配相等连接条件外,还可以显示无法匹配连接条件的数据。

比如要显示所有员工及对应部门的记录,包括没有部门的员工记录,可以这样写:

SELECT e.last_name,
e.department_id,
d.department_name
FROM employees e
LEFT OUTER JOIN departments d ON (e.department_id = d.department_id);

等价于

SELECT e.last_name,
       e.department_id,
       d.department_name
  FROM employees   e,
       departments d
 WHERE e.department_id = d.department_id(+);

不难看出,left outer join这种方式更容易理解。

(2)右外关联:

左条件所在的表必须严格进行相等连接条件的匹配,而右条件所在的表除了匹配相等连接条件外,还可以显示无法匹配连接条件的数据!

比如要查询所有员工与对应部门的记录,包括没有任何员工的部门记录。

SELECT e.last_name,
e.department_id,
d.department_name
FROM employees e
RIGHT OUTER JOIN departments d ON (e.department_id = d.department_id);

等价于

SELECT e.last_name,
       e.department_id,
       d.department_name
  FROM employees   e,
       departments d
 WHERE e.department_id(+) = d.department_id;

(3)全外关联

oracle对于全连接不支持在连接条件的左右都加(+),只能在from子句中使用full outer join ,在on子句中加连接条件。

比如,查询所有员工及对应部门的记录,包括没有对应部门的员工记录和没有任何员工的部门记录。


SELECT e.last_name,
e.department_id,
d.department_name
FROM employees e
FULL OUTER JOIN departments d ON (e.department_id = d.department_id);

 2. 注意事项

有多个连接条件的两个表在连接时如果没有都写上“(+)”,那么oracle视同简单的等值内连接。这也是oracle官方声明的:If Aand B are joined by multiple join conditions, then you must use the (+) operator in all of these conditions. If you do not, then Oracle Database will return only the rows resulting from a simple join, but without a warning or error to advise you that you do not have the results of an outer join.

同时,Oracle也不允许在一个SQL语句中一个表外连接两个表。

 

posted on 2011-08-03 15:26  时间给了够幸福的结局  阅读(574)  评论(0编辑  收藏  举报