Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在WHERE vs FROM中添加筛选器_Sql_Sql Server_Performance_Tsql - Fatal编程技术网

Sql 在WHERE vs FROM中添加筛选器

Sql 在WHERE vs FROM中添加筛选器,sql,sql-server,performance,tsql,Sql,Sql Server,Performance,Tsql,因此,我知道在查询的WHERE子句中添加过滤条件是一种很好的编程实践,这样可以最大限度地减少联接中返回的行数,但是什么时候我们才能决定是否应该在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' 在这

因此,我知道在查询的WHERE子句中添加过滤条件是一种很好的编程实践,这样可以最大限度地减少联接中返回的行数,但是什么时候我们才能决定是否应该在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'
在这个查询中,如果我在AND子句中添加了b.ColD,而不是WHERE,会怎么样?这不会使查询更有效吗?我知道有时两种方法的结果可能不同,但我不知道为什么


谢谢。

在SQL等声明性语言中,我发现尽可能声明性很有帮助,即保持
JOIN
逻辑(“我想如何连接我的数据?”)与
WHERE
逻辑(“我想过滤什么?”)分离


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

这对我的经验几乎没有影响。可以,但不经常。 查询优化者解决了这一问题,您无需再次猜测

但是,当使用左连接时,这可能很重要,因为它会更改查询语义

一般来说。此答案仅供参考

注:问题不是“加入何处差异”,而是“加入何处差异”

我只会这么做

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'
或者,如果更复杂,我想让它读得更好
如果乐观主义者愚蠢(罕见),这也会有所帮助:


在最后一种情况下,也可以使用CTE对其进行进一步细分以提高可读性

根据tsql标记判断,您使用的是SQL Server。ManagementStudio能够显示查询的执行计划,因此您可以比较两个版本的差异。我的猜测是不会有太大的区别,虽然。这不是重复:OP是问过滤器,而不是JOINs@gbn我不确定OP的措辞(“过滤器”与“条件”等)是否如此重要,因为OP给出的示例基本上与、、等相同。所有这些人都在上加入了,,询问
在哪里
,并包括与您的答案类似的答案。在我看来,这个问题似乎已经得到了回答,或者我们应该重新开始吗?@TimLehner:如果这个问题与拟议中的傻瓜类似的话。在本例中,我(和dba.sw huys)将其理解为“我应该在连接中过滤”而不是“我应该在何处连接”。也许很微妙,但我是如何理解这个问题的。OP还询问“在连接中过滤”是否更有效。他,;基本上,除了第三个可能的例外,我的例子都是“我应该在连接中过滤”的问题。不管怎样,我想没有必要重复这一点。尽管如此,你的回答还是很好。
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