none
on 和 where的问题 RRS feed

  • 问题

  • SELECT spp.Id
          ,spp.DELETE_KBN
    FROM   spp
           LEFT JOIN spm
                ON  spp.Id = spm.Bussiness_Id
    AND spp.DELETE_KBN = '0'

    将DELETE_KBN !=0的也查出来了

    SELECT spp.Id
          ,spp.DELETE_KBN
    FROM   spp
           LEFT JOIN spm
                ON  spp.Id = spm.Bussiness_Id
    where spp.DELETE_KBN = '0' 

    这样才能正确的查出数据,请问这二者在执行上的不同是什么?


    提问题真爽
    2010年9月6日 6:05

答案

  • 在使用left jion时,on和where条件的区别如下:

    1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

    2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

    2010年9月6日 6:14

全部回复

  • 在使用left jion时,on和where条件的区别如下:

    1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

    2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

    2010年9月6日 6:14
  • SELECT语句的前几步处理顺序如下。从这里可以看出,过滤条件放ON和WHERE的区别。

    从定义来说,R LEFT JOIN S ON <filter>的结果就是(1)RxS中符合<filter>的行;(2)前面结果里面没有包括的R的其他行。不过如果是INNER JOIN, 那么<filter>放ON或者WHERE结果是一样的。

    1. 处理FROM子句

       1.1 生成笛卡尔积 (cross join),也就是结果包括两个表所有行的组合

       1.2 处理ON过滤条件:不符合的记录会被排除

       1.3 补充OUTER JOIN缺少的行

    2. 处理WHERE子句

    。。。

    2010年9月8日 9:49