[T-Sql]用left join 的时候,把条件放在 On 里和在Where 里是有区别的!

举个例子, 有表 titles 和 sales, 通过 title_id 把salse 表左连接到title 表上.

SELECT T.title_id, T.title
FROM titles T
    LEFT JOIN sales S
    on T.title_id = S.title_id
WHERE S.stor_id = '7131'
ORDER BY T.title

注意,上面这段代码里,右表条件放在 where 后面。 现在把右表条件移到 join 的on 下面

SELECT T.title_id, T.title
FROM titles T
    LEFT JOIN sales S
    on T.title_id = S.title_id
         and S.stor_id = '7131'
ORDER BY T.title

请问,这两段代码的执行结果有区别吗? 我真是罗嗦,既然在写这篇,当然是有区别的。 简而言之,left join 加右表where 条件会把 left join 变成inner join . 为什么会这样呢? 因为where 语句是发生在 join 和on 的后面。 如果把右表条件放在where 里。左join 完之后, where 会把结果集里右表条件为空的 行 统统过滤掉(left join 的时候,右边会有很多null 值join 进来) ; 而把右表条件放在 on 里面,sql 会先取符合条件的右表结果集join 到左表里去。

结论:

如果你用left join , 我猜, 你把条件放在 on 里 往往是对的。

参考文章:

1. http://www.sqlteam.com/article/additional-criteria-in-the-join-clause
2. http://blog.sqlauthority.com/2009/03/15/sql-server-interesting-observation-of-on-clause-on-left-join-how-on-clause-effects-resultset-in-left-join/
3. http://wiki.lessthandot.com/index.php/WHERE_conditions_on_a_LEFT_JOIN

blog comments powered by Disqus