`

(转)oracle外连接符号(+)的用法

阅读更多

我们都知道,PL/SQL中实现外连接,除了可以用关键词OUTER JOIN外,还可以用Oracle的外连接符号(+)。对于这个外连接符号(+),虽然看到书上说:使用(+)进行外连接时,where条件中,对于附表的字段都应带上(+)。但在实际应用中,发现对它的理解还远远不够。现在结合实际的SQL语句,让我们再仔细地瞧瞧这个(+)的"真面目"吧。

首先,我们来看一下Oralce的《SQL Reference》对它的一点说明。

—————————————————————————————————————

If the WHERE clause contains a condition that compares a column from table B with a
constant, then the (+) operator must be applied to the column so that Oracle returns
the rows from table A for which it has generated nulls for this column. Otherwise
Oracle returns only the results of a simple join.

                                                                    注:table A为主表,table B为附表。

—————————————————————————————————————

现在有以下两张表:

                                              表A 员工(EMPLOYEE)

  

EMP_NO

EMP_NAME

JOB

DEPT_NO

1

1

HXF

PRESIDENT

2

2

2

SCOTT

CLERK

1

3

3

SMITH

SALESMAN

3

4

4

JOHN

MANAGER

 

                                                       

                                              表B 部门(DEPARTMENT)

  

DEPT_NO

DEPT_NAME

LOCATION

DEL_FLG

1

1

ACCOUNTING

HANGZHOU

0

2

2

RESEARCH

BEIJING

0

3

3

OPERATIONS

SHANGHAI

1

 

其中部门表中字段DEL_FLG为0表示该条记录已删除,是无效记录;反之相反。
 

如果需要找出表A中的所有记录,并关联上表B中的有效记录,我们很可能会写出以下三种SQL语句:

 
    语句一:

SELECT A.EMP_NAME, A.JOB, B.*
 
FROM EMPLOYEE A, DEPTMENT B
 
WHERE A.DEPT_NO = B.DEPT_NO(+)
   
AND B.DEL_FLG(+) = '0'

该语句利用Oracle的外连接符号,并用条件B.DEL_FLG(+) = '0'限定表B种的有效记录。也有人可能会写成语句二:

     语句二:

SELECT A.EMP_NAME, A.JOB, B.*
 
FROM EMPLOYEE A, DEPTMENT B
 
WHERE A.DEPT_NO = B.DEPT_NO(+)
   
AND B.DEL_FLG = '0'

语句二中表B中的字段DEL_FlG没带外连接符号。还有种写法,如语句三: 

    语句三:

SELECT *
 
FROM (SELECT A.EMP_NAME, A.JOB, B.*
          
FROM EMPLOYEE A, DEPTMENT B
         
WHERE A.DEPT_NO = B.DEPT_NO(+))
 
WHERE DEL_FLG IS NULL
OR
 DEL_FLG = '0'

       该语句首先将表A和表B通过外连接关联起来,然后对表B中的字段DEL_FlG进行限定,因为要关    联表B中的有效字段,所以有条件DEL_FLG = '0',又因为是左连接,所以会有结果集中表B的记录为空的情况,所以又加上条件DEL_FLG IS NULL
 

      粗粗看起来,以上三种SQL语句的写法都有道理,没有问题。那我们再来看下它们的执行结果:

                            语句一的执行结果

  

EMP_NAME

JOB

DEPT_NO

DEPT_NAME

LOCATION

DEL_FLG

1

SCOTT

CLERK

1

ACCOUNTING

HANGZHOU

0

2

HXF

PRESIDENT

2

RESEARCH

BEIJING

0

3

JOHN

MANAGER

 

 

 

 

4

SMITH

SALESMAN

 

 

 

 


                                            语句二的执行结果

 

EMP_NAME

JOB

DEPT_NO

DEPT_NAME

LOCATION

DEL_FLG

1

HXF

PRESIDENT

2

RESEARCH

BEIJING

0

2

SCOTT

CLERK

1

ACCOUNTING

HANGZHOU

0


                                                语句三的执行结果

  

EMP_NAME

JOB

DEPT_NO

DEPT_NAME

LOCATION

DEL_FLG

1

SCOTT

CLERK

1

ACCOUNTING

HANGZHOU

0

2

HXF

PRESIDENT

2

RESEARCH

BEIJING

0

3

JOHN

MANAGER

 

 

 

 

 
    我们发现三条语句的执行结果截然不同。那到底哪一个是对的呢? 

首先我们应该清楚,要求是以表A为主表,表B为附表的外连接,根据外连接的定义,就要求选出表A中的所有记录,显然语句二和三的结果就不符号这个要求。其次,我们要求选出表B中的有效记录,出现在结果集中的表B的字段DEL_FLG的值只能是0。由此可见,语句一的执行结果是正确的。

    那么语句二和三是怎么回事呢?在语句二中,虽然对两张表中的相关字段进行了外连接,但是,对附表B中的字段DEL_FLG限定条件的时候,没有使用外连接符号,导致这个连接变成了全连接。语句三的话,最具有迷惑性,表面看上去很有道理,但实际上它不是真正的外连接,

    它把跟附表B中的无效记录相关联的表A中的记录也排除在外了,这是不符号外连接要求的。最重要的是,我们要明白对于外连接,有主表和附表之分,主表中的记录要全部选出,而附表中的记录可有可无。

 

 

 转自:http://blog.csdn.net/feifei666888/article/details/5653601

 

分享到:
评论

相关推荐

    oracle列合并的实现方法

    很多场合我们都会用到...sys_connect_by_path(字段名, 2个字段之间的连接符号),这里的连接符号不要使用逗号,oracle会报错,如果一定要用,可以使用replace替换一下,方法如下 REPLACE(字段名,原字符,’,’)。这个

    Oracle中SQL语句连接字符串的符号使用介绍

    您可能感兴趣的文章:深入分析C#连接Oracle数据库的连接字符串详解Oracle中字符串连接的实现方法ADO.NET 连接数据库字符串小结(Oracle、SqlServer、Access、ODBC)ORACLE常用数值函数、转换函数、字符串函数Oracl

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。  JARED STILL 从1994年就开始使用...

    ORACLE11G宝典.rar 是光盘里面的内容,书太厚咧没法影印啊

     《Oracle11g宝典》以Oracle提供的示例数据库为背景,从基本原理、理论提高、实际操作、经验策略、应用开发等方面,结合命令行方式、开发工具的使用、管理工具的使用、Oracle与Windows之间的关系等知识点,按照学习...

    Oracle用户密码含有特殊字符导致无法登陆解决方法

    今天碰到一个比较奇怪的问题: 在客户端上使用sqlplus用普通用户可以登录,但是system以及sys用户均无法登录,提示ORA-12154: TNS: 无法解析指定的连接标识符 SQL> conn system@webdata 输入口令: ERROR: ORA-12154: ...

    Oracle8i_9i数据库基础

    §7.1.2 外连接 180 §7.1.3 自我连接 181 §7.1.4 UNION,INTERSECT及MINUS 182 §7.2 创建复杂的视图 183 §7.2.1 分组视图 183 §7.2.2 合计视图 183 §7.2.3 组合视图 184 §7.3 家族树 184 §7.3.1 排除单一体和...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第2/2部分)

    4.2 使用Oracle共享服务器体系结构 128 4.2.1 专用服务器体系结构的局限性 129 4.2.2 共享服务器体系结构 130 4.2.3 配置共享服务器 132 4.2.4 使用共享服务器的场合 132 4.3 本章知识点回顾 134 4.4 自测题 ...

    Oracle9i的init.ora参数中文说明

    说明: 指定 Oracle 使用哪种日历系统作为日期格式。例如, 如果 NLS_CALENDAR 设置为 'Japanese Imperial', 那么日期格式为 'E YY-MM-DD'。即: 如果日期是 1997 年 5 月 15 日, 那么 SYSDATE 显示为 'H 09-05-15'。 ...

    mssql2005字符串连接方法 避免无效的连接错误

    换了N种字符串连接的方法,终于连接上去了。... 您可能感兴趣的文章:C# 连接SQL数据库的方法及常用连接字符串sql server 2008数据库连接字符串大全Oracle中SQL语句连接字符串的符号使用介绍sqlserver、my

    oracle sys_connect_by_path 函数 结果集连接

    今天无意间,看connect by的使用,看到了sys_connect_by_path的用法,算是给我一个另类的惊喜了,sys_connect_by_path(columnname, seperator) 也可以拼出串来,不过这个函数本身不是用来给我们做这个结果集连接用...

    OCPOCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)--详细书签版(第1/2部分)

    4.2 使用Oracle共享服务器体系结构 128 4.2.1 专用服务器体系结构的局限性 129 4.2.2 共享服务器体系结构 130 4.2.3 配置共享服务器 132 4.2.4 使用共享服务器的场合 132 4.3 本章知识点回顾 134 4.4 自测题 ...

    sql 多表查询

    sql的多表查询。详细介绍与分解。 多表查询 等连接 通过两个表具有相同意义的列,建立连接条件. 查询结果只显示两个列中的... (+)修饰符号用法:放置在选出结果只包含等连接的列后,则另一列的结果就是等值行+非等值行

    程序员的SQL金典6-8

     9.3.4 CowNewSQL的使用方法 第10章 高级话题  10.1 SQL注入漏洞攻防  10.1.1 SQL注入漏洞原理  10.1.2 过滤敏感字符  10.1.3 使用参数化SQL  10.2 SQL调优  10.2.1 SQL调优的基本原则  10.2.2 索引  ...

    程序员的SQL金典7-8

     9.3.4 CowNewSQL的使用方法 第10章 高级话题  10.1 SQL注入漏洞攻防  10.1.1 SQL注入漏洞原理  10.1.2 过滤敏感字符  10.1.3 使用参数化SQL  10.2 SQL调优  10.2.1 SQL调优的基本原则  10.2.2 索引  ...

Global site tag (gtag.js) - Google Analytics