今天看代码发现了一个sql语句的字代码:
1.select *
from ccc.BOND_CODE_CONT b
left join ccc.BOND_RATE_CHAN c
on (b.bond_uni_code = c.bond_uni_code and
c.cur_inte_start_date <= sysdate and c.cur_inte_end_date >= sysdate);
2.select *
from ccc.BOND_CODE_CONT b, ccc.BOND_RATE_CHAN c
where b.bond_uni_code = c.bond_uni_code(+) and
c.cur_inte_start_date <= sysdate and c.cur_inte_end_date >= sysdate;
这两个语句有什么区别?
第一个语句的等价语句是什么??
------解决方案--------------------
这两个语句 很大的区别 得到的结果集是不同的
on : 条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录
where 是生成临时表之后再对结果集进行筛选
所以 第一个语句得到的结果集 是返回ccc.BOND_CODE_CONT 这个表的全集的
而第二个语句的结果集 可能被 c.cur_inte_start_date <= sysdate and c.cur_inte_end_date >= sysdate 给筛选掉了
第一个语句的等价语句是:
- SQL code
select * from ccc.BOND_CODE_CONT b left join (select * from ccc.BOND_RATE_CHAN where cur_inte_start_date <= sysdate and cur_inte_end_date >= sysdate) c on b.bond_uni_code = c.bond_uni_code where 1=1;
------解决方案--------------------
举个简单的例子
tab1
id name
1 jack
2 kate
3 lock
tab2
name value
jack 2
kate 3
select * from tab1 left join tab2 on(tab1.name=tab2.name and tabl2.value=2);
这个语句得到的结果集是3条
select * from tab1 left join tab2 on(tab1.name=tab2.name) where tabl2.value=2;
下面的语句得到的结果就只有1条了
------解决方案--------------------
我是个Oracle的新手,最近刚刚开始学习Oracle,不过我更赞同1楼的朋友观点
------解决方案--------------------
第二条SQL,增加两个(+),结果就和第一条一样了,不信你试试。
select *
from ccc.BOND_CODE_CONT b, ccc.BOND_RATE_CHAN c
where b.bond_uni_code = c.bond_uni_code(+) and
c.cur_inte_start_date(+) <= sysdate and c.cur_inte_end_date(+) >= sysdate;