关于ORACLE外连接(+)
来源:互联网 发布:万方机构信息数据库 编辑:程序博客网 时间:2024/06/05 00:25
现在有以下两张表:
表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中的记录也排除在外了,这是不符号外连接要求的。最重要的是,我们要明白对于外连接,有主表和附表之分,主表中的记录要全部选出,而附表中的记录可有可无。
- 关于ORACLE外连接(+)
- 关于Oracle的外连接符合(+)
- 关于oracle 内、外连接的若干问题
- 关于ORACLE连接池
- 关于连接Oracle数据库
- 关于win10X64 连接oracle
- oracle 中关于左连接
- 关于PL/SQL连接ORACLE
- oracle连接总结(内连接、外连接、自然连接,交叉连接,自连接)
- oracle连接总结(内连接、外连接、自然连接,交叉连接,自连接)
- 连接oracle的总结(关于tnsname和监听)
- 连接oracle的总结(关于tnsname和监听)
- oracle连接的总结(关于tnsname和监听)
- oracle连接的总结(关于tnsname和监听)
- 关于Hibernate连接到Oracle上的设置(映射)
- 【经典】连接oracle的总结(关于tnsname和监听)
- 连接oracle的总结(关于tnsname和监听)
- 关于数据库连接字符串问题(第三部分连接Oracle)
- 计算机小常识
- AMI BIOS 编译不过的处理方法
- win7 垃圾文件清理
- Access字符串处理函数
- 一个DMA 分配失败问题研究
- 关于ORACLE外连接(+)
- 幻灯片地址
- JS常用验证.txt
- ubuntu在“屏幕捕捉”图像上添加一个阴影
- setmem
- C#笔试题目(综合版样题)
- OpenGL配置 (VC6.0为例) OpenGL开发环境配置
- Builder
- UNIX环境高级编程英语阅读学习第一章第一节.