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

新手:两个oracle语句的区别?
今天看代码发现了一个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;