日期:2014-05-17  浏览次数:20872 次

oracle使用(+)操作符,在一本书上看到这句话,是不是有错误
当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符

这句话是不是不正确啊, 好想只要连接字段的条件加(+)操作符就可以了吧

select a.dname,b.ename from dept a,emp b where a.deptno=b.deptno(+) and b.deptno(+)=10
  and 等等,都要用(+)操作符吗,

我看我们的项目中,好多语句都只是连接字段中使用(+),其他的条件都没有写,会不会有错误啊



我在这里就讨论这个问题,不是讨论用不用(+)的问题, oracle 9i开始就建议使用outer join执行外连接




------解决方案--------------------
个人习惯了
------解决方案--------------------
他语文没学好而已。

+代表on的条件,就算两个值不等,如果左右连接,也能出来相应的行。

没有+代表where条件(也可以看成是inner join),两个值不等的根本不会出现在结果集中
------解决方案--------------------
哈哈,习惯很可怕~不过不影响使用
------解决方案--------------------
SQL code

create table t1(id varchar2(50),name varchar2(50));
create table t2(id varchar2(50),name varchar2(50));
insert into t1 values ('1','a');
insert into t1 values ('2','b');
insert into t1 values ('3','c');
insert into t2 values ('1','d');
insert into t2 values ('4','f');
select * from t1,t2 where t1.id=t2.id(+) and t2.name='d'   --t2.name 不加(+)
ID      NAME       ID          NAME
----------------------------------- --
1        a          1           d

select * from t1,t2 where t1.id=t2.id(+) and t2.name(+)='d'  --t2.name 加(+)
ID      NAME       ID          NAME
---------------- --------------------- 
1        a          1           d
3        c          
2        b

------解决方案--------------------
顶这个呀:
探讨
当使用(+)操作符执行外连接时,如果在where子句中包含有多个条件,则必须在所有条件中都包含(+)操作符

这句话是不是不正确啊, 好想只要连接字段的条件加(+)操作符就可以了吧

select a.dname,b.ename from dept a,emp b where a.deptno=b.deptno(+) and b.deptno(+)=10
and 等等,都要用(+)操……

------解决方案--------------------
select a.dname,b.ename from dept a,emp b where a.deptno=b.deptno(+) and b.deptno(+)=10
像这种的b表每个字段都要加(+)的,因为如果不加的话相当于对b表直接过滤了,那就跟全没加(+)号一样了,变成了等值连接,不等值的b表行全抛弃。
------解决方案--------------------
探讨
select a.dname,b.ename from dept a,emp b where a.deptno=b.deptno(+) and b.deptno(+)=10
像这种的b表每个字段都要加(+)的,因为如果不加的话相当于对b表直接过滤了,那就跟全没加(+)号一样了,变成了等值连接,不等值的b表行全抛弃。

------解决方案--------------------
除了连接条件加(+)
如果其他条件是针对从表的,那应该加(+)
就相当于
select * from t1,t2 where t1.id=t2.id(+) and t2.name='d' --t2.name 不加(+)

select * from t1
left join t2 on t1.id=t2.id 
where t2.name='d'

select * from t1,t2 where t1.id=t2.id(+) and t2.name(+)='d' --t2.name 加(+)

select * from t1
left join t2 on t1.id=t2.id and t2.name='d' 

不过个人坚决反对使用(+)
更BS那些对(+)都没我了解的新人
老是模仿老手们的写法
还以为自己懂得高效率