Join或Where子句在限制结果集方面更有效吗?

时间:2010-10-28 00:20:44

标签: sql sql-server tsql join

我需要限制基于Col1的SELECT语句的结果集具有1对多的潜在值。例如,我想返回Col1等于值1,2和3的所有行。

到目前为止,我有两种不同的方法来限制结果集:

方法#1

Inner Join Table1 On (Table2.ColA=Table1.ColA) And (Col1=1 And Col1=2 And Col1=3)

方法#2

Inner Join Table1 On Table2.ColA=Table1.ColA
Where (Col1=1 And Col1=2 And Col1=3)

这些方法中的一种是首选还是有更高效的替代方法?这些值是动态的,并在每次调用时传递给存储过程。

谢谢, 克里斯

5 个答案:

答案 0 :(得分:8)

INNER JOINs

当处理INNER JOIN时,如果正在连接的表上的过滤遵循ON子句,或者在WHERE子句中发生 - 它将产生相同的内容结果集。

外部联接

但对于OUTER JOIN来说情况并非如此...... 在OUTER JOIN中,如果在ON子句中指定过滤条件,则在 JOIN之前应用标准。这是一个例子:

     FROM TABLE_1 a
LEFT JOIN TABLE_2 b ON b.cola = a.cola
                   AND b.col1 IN (1,2,3)

与在WHERE中指定条件的情况相比,这会严重影响结果集:

     FROM TABLE_1 a
LEFT JOIN TABLE_2 b ON b.cola = a.cola
    WHERE b.col1 IN (1,2,3)

结论

重要的是你:

  1. 了解差异
  2. 在您的查询结构中保持一致

答案 1 :(得分:3)

这不是效率问题。您的限制限制将返回哪些行;因此它们在逻辑上属于WHERE子句。

答案 2 :(得分:0)

预先清理的WHERE(子查询),但请检查查询计划中的差异:

SELECT ...
FROM   ...
JOIN   (select ... from table1 where col1 in (1,2,3) ) as Table1
ON     Table1.ColA = Table2.ColA

答案 3 :(得分:0)

您的说明中写着“1,2或3”,因此您需要

Where (Col1=1 Or Col1=2 Or Col1=3)

或者你可以这样做

Where Col1 in (1, 2, 3)

答案 4 :(得分:0)

没关系,优化器最终会生成相同的查询。我认为WHERE子句中的过滤更具可读性,特别是对于内连接。