今天看代码发现了一个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;
这两个语句有什么区别?
第一个语句的等价语句是什么??

解决方案 »

  1.   

    这两个语句 很大的区别 得到的结果集是不同的
    on :  条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录
    where 是生成临时表之后再对结果集进行筛选所以 第一个语句得到的结果集 是返回ccc.BOND_CODE_CONT 这个表的全集的 
    而第二个语句的结果集 可能被 c.cur_inte_start_date <= sysdate and c.cur_inte_end_date >= sysdate 给筛选掉了第一个语句的等价语句是: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;务必要弄清楚 on 与 where 的区别
      

  2.   

    举个简单的例子
    tab1 
    id name 
    1   jack
    2   kate
    3   locktab2
    name  value
    jack  2
    kate  3select * 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条了
      

  3.   

    个人认为两个语句的结果是等价的。
    都是进行左外连接。
    第1个语句为SQL92的写法,而第2个语句为SQL89的写法。可以加上数据实测一下。
      

  4.   

    我是个Oracle的新手,最近刚刚开始学习Oracle,不过我更赞同1楼的朋友观点
      

  5.   

    第二条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;