在外连接中使用常量过滤的作用

常量的右连接问题。在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(+)
 
 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值