对于外连接Oracle中可以使用(+)来表示i可以使用LEFT/RIGHT/FULL OUTER JOIN下面将配合实例一一介绍
LEFT OUTER JOIN左外关联
SELECT elast_name edepartment_id ddepartment_name
FROM employees e
LEFT OUTER JOIN departments d
ON (edepartment_id = ddepartment_id);
等价于
SELECT elast_name edepartment_id ddepartment_name
FROM employees e departments d
WHERE edepartment_id=ddepartment_id(+);
结果为所有员工及对应部门的记录包括没有对应部门编号department_id的员工记录
RIGHT OUTER JOIN右外关联
SELECT elast_name edepartment_id ddepartment_name
FROM employees e
RIGHT OUTER JOIN departments d
ON (edepartment_id = ddepartment_id);
等价于
SELECT elast_name edepartment_id ddepartment_name
FROM employees e departments d
WHERE edepartment_id(+)=ddepartment_id;
结果为所有员工及对应部门的记录包括没有任何员工的部门记录
FULL OUTER JOIN全外关联
SELECT elast_name edepartment_id ddepartment_name
FROM employees e
FULL OUTER JOIN departments d
ON (edepartment_id = ddepartment_id);
结果为所有员工及对应部门的记录包括没有对应部门编号department_id的员工记录和没有任何员工的部门记录
外连接:
除了显示匹配相等连接条件的数据外还可以显示某一个表中无法匹配相等连接条件的记录!
) 左条件(+) = 右条件
左条件所在的表必须严格进行相等连接条件的匹配而右条件所在的表除了匹配相等连接条件外还可以显示无法匹配连接条件的数据!
也称为右外连接
可以用下列语句取代:
SELECTFROM 表 RIGHT OUTER JOIN 表 ON 条件;
) 左条件 = 右条件(+)
右条件所在的表必须严格进行相等连接条件的匹配而左条件所在的表除了匹配相等连接条件外还可以显示无法匹配连接条件的数据!
也称为左外连接
可以用下列语句取代:
SELECTFROM 表 LEFT OUTER JOIN 表 ON 条件;
REM 除了相等连接之外显示没有员工的部门信息
SELECT * FROM EMPDEPT WHERE EMPDEPTNO(+) = DEPTDEPTNO;
SELECT * FROM EMP RIGHT OUTER JOIN DEPT ON EMPDEPTNO = DEPTDEPTNO;
REM 除了相等连接之外显示没有部门的员工信息
SELECT * FROM EMPDEPT WHERE EMPDEPTNO = DEPTDEPTNO(+);
SELECT * FROM EMP LEFT OUTER JOIN DEPT ON EMPDEPTNO = DEPTDEPTNO;
Oracle 建议你用在From语句后用Outer Join语法 而不是Oracle的Join操作符(+)而且(+)是要受下面的规则限制的但Outer Join语法则不受的~~
)你不可以在查询块中使用(+) 当它同时包含 join的from语句中
)(+)只是在where语句中并且只能对应一个表或视图的一行字段
)如果A和B做联接时有多个条件那么(+)必须完善所有的匹配条件
如果没有 oracle不会警告你~只是结果自然不同的
)不可以在作出一个表外查询 另张表内查询的(+)联接操作~~
)不可以用(+)外联接到自己 当然Self Join是可以的
)含(+)的Where后的注意
OR不可用
IN不可用
子查询不可用
以下给些个例子
SQL code
SQL> desc part
Name Null? Type
PART_ID NOT NULL VARCHAR()
SUPPLIER_ID VARCHAR()
SQL> select * from part;
PART SUPP
P S
P S
P
P
SQL> desc supplier
Name Null? Type
SUPPLIER_ID NOT NULL VARCHAR()
SUPPLIER_NAME NOT NULL VARCHAR()
SQL> select * from supplier;
SUPP SUPPLIER_NAME
S Supplier#
S Supplier#
S Supplier#
SQL> select ppart_id ssupplier_name
from part p supplier s
where psupplier_id = ssupplier_id (+);
PART SUPPLIER_NAME
P Supplier#
P Supplier#
P
P
(+)是单向的
SQL> select ppart_id ssupplier_name
from part p supplier s
where psupplier_id (+) = ssupplier_id (+);
where psupplier_id (+) = ssupplier_id (+)
*
ERROR at line :
ORA: a predicate may reference only one outerjoined table
实现Full Join的方法
SQL> select ppart_id ssupplier_name
from part p supplier s
where psupplier_id = ssupplier_id (+)
union
select ppart_id ssupplier_name
from part p supplier s
where psupplier_id (+) = ssupplier_id;
PART SUPPLIER_NAME
P Supplier#
P Supplier#
P
P
Supplier#
现在的语法
SQL> select ppart_id ssupplier_name
from part p full outer join supplier s
on psupplier_id = ssupplier_id;
PART SUPPLIER_NAME
P Supplier#
P Supplier#
P
P
Supplier#
另外的EG
SQL code
SQL> select * from testa;
ID NAME ADDR AGE
电子 南京
物理 北京
物理 河北
电脑 上海
电子 北京
物理 芜湖
艺术 上海
歌剧 苏州
沈亮 上海
已选择行
SQL> select * from testb;
ID ADDR
上海
北京
上海
合肥
匹配完全
select testaidtestaaddr from testatestb where testaid(+)=testbid and
testaaddr(+)=testbaddr;
ID ADDR
上海
现在的Outer Join方法是Oraclei时开始引用的 ANSI标准的联接语法现在的则比较直观 简单
通过上边Full Join的实现方式 不难看到ANSI的联接语法要比用含Union的(+)的执行效率更高~~