常量的右连接问题。在oracle的较前期版本中可以使用+号标识外连接中的附表,例如where t1.id = t2.id(+)标识使用t1作为基础表跟t2进行外连接,而条件where t2.id = t1.id则是使用t2作为基础表与t1进行外部连接,但偶尔也能看到诸如这种连接方式where t1.id = t2.id(+) and t2.name(+) = ‘jax’。很多人对这种连接方式的含义不甚了解,检索网上资料,一直没发现合理的答案。事实上,这种连接方式是将t1作为基础表与t2表中满足条件name = ‘jax’的部分集合进行外部连接的意思,相当于select * from t1,(select * from t2 where name = ‘jax’) t3 where t1.id = t3.id(+) ,也同时跟如下语句等价:select * from t1 left join t2 on t1.id = t2.id and t2.name = ‘jax’。
测试环境如下:
--创建测试用表t1,t2
create table t1(id varchar2(10), name varchar2(10));
create table t2(id varchar2(10), name varchar2(10));
--插入测试用语句
insert into t1 values(1,'zhanglei');
insert into t1 values(2,'zhghaitao');
insert into t2 values(1,'1');
insert into t2 values(1,'2');
insert into t2 values(1,'3');
insert into t2 values(2,'4');
insert into t2 values(2,'5');
insert into t2 values(2,'6');
--简单使用谓词where name(+) = 1时其作用跟where name = 1完全相同。
select * from t2
where name(+) = '1'
--如果将谓词where name(+) = 1跟其它连接语句结合使用,则oracle在处理时会先将原表过滤,使用得到的中间结果跟其它集合进行连接。如下三个sql语句结果相同。
select *
from t1,t2
where t1.id = t2.id(+) and t2.name(+) = '1'
select *
from t1 left join t2 on t1.id = t2.id and t2.name = '1'
select * from
t1 , (select * from t2 where name = '1') t3
where t1.id = t3.id(+)