数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle外连接和“+”号的用法


发布日期:2019年08月10日
 
Oracle外连接和“+”号的用法

对于外连接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的(+)的执行效率更高~~

上一篇:连接oracle的总结(关于tnsname和监听)

下一篇:中小型数据库RMAN CATALOG备份解决办法