首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用连接而不是WHERE进行过滤

问使用连接而不是WHERE进行过滤
EN

Stack Overflow用户
提问于 2009-12-15 21:08:49
回答 6查看 2.9K关注 0票数 11

在SQL (MSSQL、Oracle等)中,当连接表时,将筛选器添加到连接语句中而不是将其放在WHERE子句中有什么好处?

即

代码语言:javascript
复制
SELECT * FROM X INNER JOIN Y ON X.A = Y.A WHERE X.B = 'SOMETHING'

对比

代码语言:javascript
复制
SELECT * FROM X INNER JOIN Y ON X.A = Y.A AND X.B = 'SOMETHING'

我意识到这并不适用于所有情况,但我注意到,在某些情况下,通过将筛选条件放入JOIN语句中,似乎可以提高性能。然而,由于它是JOIN语句的一部分,它也可能导致它的行为有点奇怪。

有什么想法?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-12-15 21:18:22

对于INNER JOIN查询,这些过滤器的性能特征将取决于许多因素-表的大小、索引、查询的选择性以及执行查询的RDBMS特有的其他因素。

在LEFT和RIGHT OUTER JOIN中,过滤器的位置比INNER JOIN重要得多,因为它影响是在执行连接之前(JOIN子句)还是之后(WHERE子句)应用它。

票数 5
EN

Stack Overflow用户

发布于 2009-12-15 21:11:43

我有时在有很多连接的查询中这样做,因为它将有关连接的所有信息本地化在查询的一部分,而不是在连接条件中有一些信息,在where子句中有一些信息。

票数 5
EN

Stack Overflow用户

发布于 2009-12-15 21:19:17

对于内部连接,我不期望性能差异,而是无论过滤器是在JOIN...ON子句中还是在WHERE子句中,都将使用相同的计划。我个人更喜欢在join子句中编写连接条件,在WHERE子句中使用过滤-一种将所有“参数”粘贴到SQL语句中的方法-这不一定是明智的或经过深思熟虑的。相反,有些人喜欢将所有内容都放在JOIN子句中,以将所有内容放在一起。

外部连接的情况是不同的- "a LEFT ON join b ON a.a_id=b.a_id and b.type = 1“和"a LEFT ON JOIN b ON a.a_id=b.a_id WHERE b.type=1"-事实上,后者隐式地强制执行内部连接。这将是将所有这些条件放在JOIN子句中以保持一致性的另一个原因。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1907335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档