我们都知道,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
相关推荐
很多场合我们都会用到...sys_connect_by_path(字段名, 2个字段之间的连接符号),这里的连接符号不要使用逗号,oracle会报错,如果一定要用,可以使用replace替换一下,方法如下 REPLACE(字段名,原字符,’,’)。这个
您可能感兴趣的文章:深入分析C#连接Oracle数据库的连接字符串详解Oracle中字符串连接的实现方法ADO.NET 连接数据库字符串小结(Oracle、SqlServer、Access、ODBC)ORACLE常用数值函数、转换函数、字符串函数Oracl
其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...
有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。 JARED STILL 从1994年就开始使用...
《Oracle11g宝典》以Oracle提供的示例数据库为背景,从基本原理、理论提高、实际操作、经验策略、应用开发等方面,结合命令行方式、开发工具的使用、管理工具的使用、Oracle与Windows之间的关系等知识点,按照学习...
今天碰到一个比较奇怪的问题: 在客户端上使用sqlplus用普通用户可以登录,但是system以及sys用户均无法登录,提示ORA-12154: TNS: 无法解析指定的连接标识符 SQL> conn system@webdata 输入口令: ERROR: ORA-12154: ...
§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 排除单一体和...
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 自测题 ...
说明: 指定 Oracle 使用哪种日历系统作为日期格式。例如, 如果 NLS_CALENDAR 设置为 'Japanese Imperial', 那么日期格式为 'E YY-MM-DD'。即: 如果日期是 1997 年 5 月 15 日, 那么 SYSDATE 显示为 'H 09-05-15'。 ...
换了N种字符串连接的方法,终于连接上去了。... 您可能感兴趣的文章:C# 连接SQL数据库的方法及常用连接字符串sql server 2008数据库连接字符串大全Oracle中SQL语句连接字符串的符号使用介绍sqlserver、my
今天无意间,看connect by的使用,看到了sys_connect_by_path的用法,算是给我一个另类的惊喜了,sys_connect_by_path(columnname, seperator) 也可以拼出串来,不过这个函数本身不是用来给我们做这个结果集连接用...
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的多表查询。详细介绍与分解。 多表查询 等连接 通过两个表具有相同意义的列,建立连接条件. 查询结果只显示两个列中的... (+)修饰符号用法:放置在选出结果只包含等连接的列后,则另一列的结果就是等值行+非等值行
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 索引 ...
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 索引 ...