首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >join上的FIltering?

join上的FIltering?
EN

Stack Overflow用户
提问于 2011-02-09 11:09:08
回答 3查看 37K关注 0票数 21

与WHERE子句相反,在连接中是否有任何参数可以在性能方面进行过滤?

例如,

代码语言:javascript
复制
SELECT blah FROM TableA a
INNER JOIN TableB b
ON b.id = a.id
AND b.deleted = 0
WHERE a.field = 5

而不是

代码语言:javascript
复制
SELECT blah FROM TableA a
INNER JOIN TableB b
ON b.id = a.id
WHERE a.field = 5
  AND b.deleted = 0

我个人更喜欢后者,因为我觉得过滤应该在过滤部分(WHERE)中完成,但是有没有任何性能或其他原因来做这两种方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-09 11:14:59

如果查询优化器完成了它的工作,那么内部连接的两种形式根本没有区别(除了其他形式的清晰度)。

也就是说,with left joins在join中有一个条件,用于在连接之前过滤掉第二个表中的行。where中的条件表示在联接后从最终结果中筛选出行。这意味着非常不同的事情。

票数 36
EN

Stack Overflow用户

发布于 2011-02-10 04:41:15

不,这两者之间没有区别,因为在查询的逻辑处理中,WHERE总是紧跟在filter子句(ON)之后,在您的示例中,您将看到:

  1. 笛卡尔积( TableA中的行数x TableB中的行数)
  2. Filter (ON)
  3. Where.

您的示例使用ANSI SQL-92标准,您也可以使用ANSI SQL-89标准编写查询,如下所示:

代码语言:javascript
复制
SELECT blah FROM TableA a,TableB b
WHERE b.id = a.id AND b.deleted = 0 AND a.field = 5

对于内部连接是这样的,外部连接类似,但不是相同的

票数 1
EN

Stack Overflow用户

发布于 2011-02-10 05:34:20

使用内部连接,您将获得相同的结果,并且可能具有相同的性能。但是,使用外部连接时,两个查询将返回不同的结果,并且根本不等价,因为将条件放在where子句中实际上会将查询从左连接更改为内连接(除非您正在查找某些字段为空的记录)。

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

https://stackoverflow.com/questions/4940926

复制
相关文章

相似问题

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