全外连接的用法实例和注意点

一. 全外连接技术

全外连接:返回符合两张表的所有记录。

全外连接的用法实例和注意点

实例说明:


现有如下两张表

表一(表名:T1)

F1F2
20050110
20050220
20050330

表二(表名:T2)

F1F2
20050220
20050330
20050440

全外连接SQL:
        SELECT
           NVL(T1.F1, T2.F1) AS F1,
           T1.F2 AS T1F2,
           T2.F2 AS T2F2
        FROM T1
        FULL OUTER JOIN T2
        ON (T1.F1 = T2.F1)

经过以上全外连接语句执行后,选择出的结果如下:
T3:

F1T1F2T2F2
20050110NULL
2005022020
2005033030
200504NULL40

 

注意点:一定要用nvl()判断连接合并的两个字段哦,不然出错!
nvl( exp,val)用法:如果exp为null,返回val,否则返回exp。

 

 

二. 全外连接最新发现  (2011.05补)

 

4年前做为技术者写了以上的文章。
4年后,再次接触这些技术,而且遇到了更深层次的一些问题。所以对以上的文章做个补充和完善。

 

上面写的实例中,对于T1和T2是物理表的话,上面写的没有任何问题。

但是如果T1和T2是SQL语句中的子查询的结果表的话,Full Outer Join 就可能会有问题。

 

当子查询结果作为两张表进行FULL OUTER JOIN时,如果后面的查询结果表T2有前面查询结果表T1匹配不到的记录,则结果发生异常。全外连接查询后T2多出的记录值也变为空。

也就是说当T2的记录比T1的记录多时候,FULL OUTE JOIN的结果并非理论上的全匹配,出现异常情况.

不过Left outer jon 和 Right Outer Join不会有问题。

 

 

实例说明:

 

Select  F1, F2 from TO1
SQL语句的查询结果 (非物理表)

F1F2
20050110
20050220
20050330

 

Select  F1, F2 from TO2
SQL语句的查询结果

F1F2
20050220
20050330
20050440

 

全外连接SQL:
        SELECT
           NVL(T1.F1, T2.F1) AS F1,
           T1.F2 AS T1F2,
           T2.F2 AS T2F2
        FROM 
              (Select  F1, F2 from TO1) T1 
        FULL OUTER JOIN
             (Select  F1, F2 from TO2) T2 
        ON (T1.F1 = T2.F1)

经过以上全外连接语句执行后的结果如下:
T3:

F1T1F2T2F2
20050110NULL
2005022020
2005033030
200504NULLNULL

 看到执行结果了把,记录200504行的最后一个字段为NULL了,我们预想的理论值应该是40哦。

 

 

 

解决方法:
1. T1 FULL OUT JOIN T2后,再次LEFT OUT JOIN T2,可以达到预期的理论结果。
2.可以将子查询先存到物理表中。适合在存储过程中处理。不适合长SQL了。

(俺的研究结果啊好强悍啊,呵呵,因为google上都搜索到有人遇到这问题和解决办法。)

 

 

 

-----End----

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值