我需要限制基于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)
这些方法中的一种是首选还是有更高效的替代方法?这些值是动态的,并在每次调用时传递给存储过程。
谢谢, 克里斯
答案 0 :(得分:8)
当处理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 :(得分: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子句中的过滤更具可读性,特别是对于内连接。