2013-05-15 62 views
5

所以我知道在查询的WHERE子句中添加过滤器条件是一种很好的编程习惯,以便尽量减少在连接中返回的行数,但是当我们如何决定是否应该在WHERE而不是FROM中添加一个过滤器?例如:在WHERE中添加过滤器与FROM

SELECT a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM TblA a INNER JOIN TblB b 
On a.ColA = b.ColD 
AND a.ColA = 'X' 
AND a.ColB = 'Y' 
WHERE b.ColD = 'ABC' 

在此查询,如果我说什么b.ColD的AND子句,而不是在哪里?这不会使查询更有效率吗?我知道这两种方法的结果可能有所不同,但我不知道为什么?

谢谢。

+0

根据tsql标记判断,您使用的是SQL Server。管理工作室能够显示查询的执行计划,因此您可以比较两个版本的差异。虽然我的_guess_是没有太大的区别。 –

+3

这不是一个重复:OP是询问过滤器,而不是JOINs – gbn

+1

@gbn我不确定OP的措辞(“过滤器”与“条件”等)如此重要,因为OP给出的例子基本上与[here](http://stackoverflow.com/q/1907335/880904),[here](http://stackoverflow.com/q/1018952/880904),[here](http:/ /stackoverflow.com/q/1401889/880904),[这里](http://stackoverflow.com/q/15483808/880904)等等。所有这些都有'JOIN ... ON',询问'WHERE',并包括类似的答案给你。在我看来,这个问题已经得到解答,或者我们是否也应该重新开放[这个问题](http://stackoverflow.com/q/13145275/880904)? –

回答

2

在像SQL这样的声明性语言中,我发现尽可能地声明性,也就是保持JOIN逻辑(“我该如何连接我的数据?”)与WHERE logic分开(“我要过滤什么出来吗?“)。

从技术上讲,它可能没有什么区别,但如果你强迫自己将两者分开,这是一个很好的理智检查。

9

这很少会影响我的体验。它可以但不经常。 查询优化器可以解决这个问题,您无需再次猜测它。

当使用LEFT JOIN的,虽然,那么就能够决定的事情,因为它改变了查询语义

一般来说,I would separate JOIN and WHERE conditions for clarity and avoid ambiguities or partial/full cross joins。这个答案是获得更多信息只有

注:问题是“在WHERE差异JOIN”,但“凡在JOIN差”

我只想做

SELECT 
    a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM 
    TblA a 
    INNER JOIN 
    TblB b On a.ColA = b.ColD 
WHERE 
    a.ColA = 'X' AND a.ColB = 'Y' AND b.ColD = 'ABC' 

或者,如果更复杂,我想让它更好的阅读
这也可以帮助,如果优化器是愚蠢(罕见):

SELECT 
    a.ColA, a.ColB, a.ColC, b.ColD, b.ColE 
FROM 
    (SELECT ColA, ColB, ColC FROM TblA 
    WHERE ColA = 'X' AND ColB = 'Y') a 
    INNER JOIN 
    (SELECT ColD, ColE FROM TblB WHERE ColD = 'ABC') b On a.ColA = b.ColD 

在这最后一种情况下,人们也可以使用CTE来进一步将其分解为可读性