oracle (+)

来源:互联网 发布:脸书注册总说网络错误 编辑:程序博客网 时间:2024/05/16 07:49

(+) 只是涉及到两张表关联时

总结: A.X1=B.X1(+)     对表B使用了外连接:

那么where语句后的 不涉及到关联第三张表的所有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'

该语句利用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没带外连接符号。


      粗粗看起来,以上三种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


                                        

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

其次,我们要求选出表B中的有效记录,出现在结果集中的表B的字段DEL_FLG的值只能是0。由此可见,语句一的执行结果是正确的。

    那么语句二是怎么回事呢?在语句二中,虽然对两张表中的相关字段进行了外连接,但是,对附表B中的字段DEL_FLG限定条件的时候,没有使用外连接符号,导致这个连接变成了全连接。这是不符号外连接要求的。

0 0