sql 左外连接on条件和where条件处细节(包括99语法和92语法数据对比)
转载2015-04-15 13:10:42
前提:测试用的两张表的名称分别为temp99和temp999,表结果相同,两张表的数据不同,如下图所示:
1、select * from temp99 a left join temp999 b on
a.t_itemcode=b.t_itemcode
and a.t_yearmonth=b.t_yearmonth and a.t_yearmonth='201403';
2、select * from temp99 a left join temp999 b on
a.t_itemcode=b.t_itemcode
and a.t_yearmonth=b.t_yearmonth where a.t_yearmonth='201403';
注:查询1和查询2的结果集不同,差别只是在于加红色的部分不同,对于第一种情况,加红色and后面的条件,仍然属于左外连接的范畴。简言之,对于左外连接,从on后面的条件开始一直到where子句出现之前之间的连接条件,左表不管连接条件是什么都全部显示,右表只显示符合连接条件的记录,对左表的记录在右表中没有符合连接条件的记录,右表予以补空。可是,一旦连接条件on连接条件结束,从where子句开始后的过滤条件,就不再遵循左表全部显示,右表没有符合的补空显示的规则。where子句后的条件是过滤条件,是在整个左外连接的结果集基础上进行再次过滤,此时已经和左外连接无关。(以上都是个人理解,偏差之处,望请指正!)
3、select * from temp99 a,temp999 b where 1=1
and a.t_itemcode=b.t_itemcode(+)
and a.t_yearmonth=b.t_yearmonth(+)
and a.t_yearmonth='201403'
注:结果集3和结果集2相同,两个sql作用等效。只不过,结果集3使用的是92语法的左外连接。
转载自:http://blog.sina.com.cn/s/blog_9d12d07f0102vk4r.html