sql - 在内连接条件之前过滤表

标签 sql join inner-join where-clause predicate

有一个类似的问题here ,但我的疑问略有不同:

select *
from process a inner join subprocess b on a.id=b.id and a.field=true
and b.field=true

那么,当使用内连接时,哪个操作先进行:连接还是a.field=true条件?

由于这两个表非常大,我的目标是首先过滤表process,然后仅连接使用表subprocess过滤的行。

哪种方法是最好的?

最佳答案

首先要做的事情:

which operation comes first: the join or the a.field=true condition?

您的 INNER JOIN 包含此 (a.field=true) 作为连接条件的一部分。因此它将阻止在 JOIN 过程中添加行。

RDBMS 的一部分是“查询优化器”,它通常会找到执行查询的最有效方法 - 无法保证 INNER JOIN 的评估顺序 条件。

最后,我建议您以这种方式重写您的查询:

SELECT *
FROM process AS a 
INNER JOIN subprocess AS b ON a.id = b.id
WHERE a.field = true AND b.field = true

这将有效地执行与原始查询相同的操作,但 SQL 程序员普遍认为它更具可读性。优化器可以根据需要重新排列 INNER JOIN 和 WHERE 谓词。

关于sql - 在内连接条件之前过滤表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22263857/

相关文章:

php - 查询返回未关注的用户结果

sql - COUNT(*) 和 COUNT SQL 中的项目列表

mysql - 如何对具有与另一个名称表相关的两列外键的表执行 mysql 选择查询

MySQL - 使用 INNER JOIN + WHERE 子句查询

mysql - mysql中的内部连接问题

php - 要从查询列表中删除的 Mysql 连接类型

mysql - 如何使用 case 语句 mysql 获取 MAX 排名

ruby-on-rails - Ruby on Rails ActiveRecord 数据流

postgresql - 加入几个表 : table specified more than once error

mysql - 插入到由主键链接的表中