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) 编辑 收藏 举报