`

(转)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 左连接(+)加号用法及常用语法之间的关系

    "+"加号在旧版Oracle SQL中是表示左连接的一个特殊符号,但在现代版本的Oracle中,通常使用标准的LEFT JOIN语法。本文将深入探讨Oracle左连接(+)加号的用法以及与其它常见语法的关系。 首先,我们创建两个测试表`...

    Oracle数据库表连接方式及常见用法

    本文将详细介绍这些连接方式的定义、使用方法和实例。 一、相等连接 相等连接是指两个表通过一个公共列连接起来的方式。只有在两个表中都存在且值相等的行才会出现在查询结果中。例如,查询员工信息以及对应的员工...

    SQL转Oracle的方法

    - Oracle 使用 `(+)` 符号来表示左连接,表示即使右侧表中的记录不存在也会返回左侧表的所有记录。 4. **RIGHT JOIN**: - SQL Server:`SELECT * FROM t1 RIGHT JOIN t2 ON t1.c1 = t2.c1;` - Oracle:`SELECT ...

    如何避免Oracle数据库的密码出现@符号

    其中,@符号是一个特殊字符,在 Oracle 中用来表明使用哪一台 Oracle 服务器。因此,在设置密码时,应该避免使用@符号,以免出现错误。 在 Oracle 中,密码的设置需要遵守一定的规则,要包含大写字母、小写字母、...

    如何避免Oracle数据库密码出现@符号

    同时,可以使用上述解决方法和建议来避免 @符号的使用,并确保 Oracle 数据库的安全性。 避免在 Oracle 数据库密码中出现 @符号是非常重要的,可以防止连接失败或安全漏洞。通过使用正确的解决方法和建议,可以确保...

    SQL-SERVER-64位配置ORACLE连接-中文乱码问题

    ### SQL-SERVER-64位配置ORACLE连接-中文乱码问题 在IT行业中,不同数据库之间的连接配置是一项常见的任务,特别是在需要实现跨平台数据交换的场景下。本文将详细介绍如何解决64位系统下的SQL Server连接Oracle...

    玩转oracle

    "玩转Oracle"这篇教程主要涵盖了Oracle数据库的基础知识和使用技巧,特别强调了数据库的管理和基本操作。Oracle数据库是一款广泛使用的、高性能的关系型数据库管理系统,它在企业级应用中占据了重要地位。 首先,...

    韩顺平玩转oracle课件.txt

    根据提供的文件内容,我们可以归纳出以下Oracle数据库管理与操作的关键知识点: ### 1....这些知识点对于初学者来说是非常实用的基础知识,能够帮助他们更好地理解和掌握Oracle数据库的操作方法。

    oracle列合并的实现方法

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

    玩转Oracle DBA实战教程

    - 交互式命令主要指&符号的使用,它可以在执行时由用户输入相应的变量值。 通过这些命令,数据库管理员可以对Oracle数据库进行日常维护操作。对于实际操作过程中可能出现的问题,如无法立即删除目录等,通过重启...

    ORACLE函数及其用法

    ### ORACLE函数及其用法详解 #### 概述 Oracle是一种广泛使用的数据库管理系统,它提供了丰富的内置函数,这些函数能够帮助开发者和数据库管理员更高效地处理数据。本文将详细介绍Oracle中的一些常用函数及其应用...

    【Oracle】LISTAGG函数的使用.pdf

    LISTAGG 函数有两个参数:要合并的列名和自定义连接符号。 LISTAGG 函数既是分析函数,也是聚合函数。它有两种用法: 1. 作为分析函数,类似于 row_number()、rank()、dense_rank() 等函数,使用方法相似: ...

    oracle连接java驱动包

    4. 建立连接:使用`DriverManager.getConnection()`方法创建数据库连接。需要提供数据库URL,用户名和密码。一个示例: ```java String url = "jdbc:oracle:thin:@hostname:port/service_name"; String user = ...

    AntDB_Oracle兼容性开发者手册v31

    例如,通过psql连接AntDB并设置语法为Oracle模式,可以执行Oracle风格的SQL语句。 手册的更新说明部分列出了AntDB单机版本中新增的Oracle兼容特性,以供开发者跟踪最新进展。 在文档书写约定部分,作者使用了特定...

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

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

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

    除了`||`运算符,Oracle还提供了一些其他的方法来连接字符串。例如,可以使用`CONCAT()`函数,它接受两个或更多个字符串作为参数,并返回它们的串联结果。例如: ```sql SELECT CONCAT(catstr(tcdm), ',') FROM T_...

Global site tag (gtag.js) - Google Analytics