一. 全外连接技术
全外连接:返回符合两张表的所有记录。
全外连接的用法实例和注意点
实例说明:
现有如下两张表
表一(表名:T1)
F1 | F2 |
200501 | 10 |
200502 | 20 |
200503 | 30 |
表二(表名:T2)
F1 | F2 |
200502 | 20 |
200503 | 30 |
200504 | 40 |
全外连接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:
F1 | T1F2 | T2F2 |
200501 | 10 | NULL |
200502 | 20 | 20 |
200503 | 30 | 30 |
200504 | NULL | 40 |
注意点:一定要用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语句的查询结果 (非物理表)
F1 | F2 |
200501 | 10 |
200502 | 20 |
200503 | 30 |
Select F1, F2 from TO2
SQL语句的查询结果
F1 | F2 |
200502 | 20 |
200503 | 30 |
200504 | 40 |
全外连接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:
F1 | T1F2 | T2F2 |
200501 | 10 | NULL |
200502 | 20 | 20 |
200503 | 30 | 30 |
200504 | NULL | NULL |
看到执行结果了把,记录200504行的最后一个字段为NULL了,我们预想的理论值应该是40哦。
解决方法:
1. T1 FULL OUT JOIN T2后,再次LEFT OUT JOIN T2,可以达到预期的理论结果。
2.可以将子查询先存到物理表中。适合在存储过程中处理。不适合长SQL了。
(俺的研究结果啊好强悍啊,呵呵,因为google上都搜索到有人遇到这问题和解决办法。)
-----End----