|
TO: TsuLeon
你对外连接的理解不正确
正常的表连接应该没问题,外连接就是在不满足连接条件的情况下使用空行去匹配
这里的连接条件当然不只是那种简单的相等条件,可以是很复杂的条件,
比如是多个条件复合成两个表之间的一个连接条件。
这里的 substr(t1.str1,1,length(t2.str2(+)))=t2.str2(+) 是一个外连接,其连接条件是
substr(t1.str1,1,length(t2.str2))=t2.str2 ,只是这个连接条件比一般的
t1.str1 = t2.str2 这一类的条件要复杂一些罢了。
Oracle 首先从 t1 中取出一行,再在 t2 中取所有的行进行 substr(t1.str1,1,length(t2.str2))=t2.str2
条件测试,如果是真,则保留该行,如果 t2 中没有任何行满足条件,则 t2 使用一个空行,
即所有字段值均为 null ;这完成一次匹配,接下来再在 t1 中取下一行....
而 and t2.str2 is null 不属于连接条件,它是一个筛选条件,是用在表连接过后的结果上
进行筛选。
现在给你描述一个复杂的连接条件,修改一下上面的 where 条件
比如:
where substr(t1.str1,1,length(t2.str2(+)))=t2.str2(+)
and length(t2.str2(+)) > 3
你能解释吗?
这里连接条件将是:
substr(t1.str1,1,length(t2.str2))=t2.str2
and length(t2.str2) > 3
而不再是单纯的 substr(t1.str1,1,length(t2.str2))=t2.str2 了 |
|