加入融合?

时间:2011-02-09 03:09:08

标签: sql-server inner-join

与WHERE子句相反,在连接中进行过滤是否有性能明智?

例如,

SELECT blah FROM TableA a
INNER JOIN TableB b
ON b.id = a.id
AND b.deleted = 0
WHERE a.field = 5

相反
SELECT blah FROM TableA a
INNER JOIN TableB b
ON b.id = a.id
WHERE a.field = 5
  AND b.deleted = 0

我个人更喜欢后者,因为我觉得过滤应该在过滤部分(WHERE)中完成,但是有任何性能或其他原因要做任何一种方法吗?

4 个答案:

答案 0 :(得分:25)

如果查询优化器完成其工作,则内部连接的两种形式完全没有区别(除了其他人的清晰度)。

也就是说,对于左连接,连接中的条件意味着在连接之前从第二个表中过滤行。 where中的条件意味着在加入后从最终结果中过滤行。那些意味着非常不同的东西。

答案 1 :(得分:1)

我认为这就是你要找的>> SQL join: where clause vs. on clause

答案 2 :(得分:0)

这两者之间没有区别,因为在查询的逻辑处理中,WHERE将始终在filter子句(ON)之后,在您的示例中,您将拥有:

  1. 笛卡尔积(TableA中的行数×表B中的行数)
  2. 过滤(开启)
  3. 其中。
  4. 您的示例采用ANSI SQL-92标准,您也可以使用ANSI SQL-89标准编写查询,如下所示:

    SELECT blah FROM TableA a,TableB b
    WHERE b.id = a.id AND b.deleted = 0 AND a.field = 5
    

    对于内部联合而言这是正确的,外部联接类似但不是相同的

答案 3 :(得分:0)

使用内部联接,您将获得相同的结果,并且可能具有相同的性能。但是,对于外连接,两个查询将返回不同的结果并且根本不相等,因为将条件放在where子句中实质上将查询从左连接更改为内连接(除非您正在查找某些记录field为null)。