1

我需要 LEFT JOIN 但“右”表非常大,我只需要 2018 年 1 月 1 日之后的值,而整个表都有 2012 年之前的记录。为了加快我的查询速度,因此我不需要 LEFT JOIN完整表,但记录 > 2018-01-01 的表。如果我在查询末尾使用 where 语句,它仍然会使用完整表吗?我怎样才能做到这一点?

4

2 回答 2

1

您可以将 where 过滤器放在联接中。

select * from tableA a
left Join tableB b on a.id=b.id and b.date > 2018-01-01
where a.field =''
于 2018-03-22T13:26:52.467 回答
1

将约束放在 where 子句中的行为与放在 on 子句中的行为不同。

原因是先执行外连接,然后执行 where 子句。查询中的任何行在可选表中没有匹配项,日期列将为空。接下来应用您的 where 子句,并且由于 null <> 任何内容,您将删除所有这些行。基本上,您会将外部联接转变为内部联接。这就是为什么要在 on 子句中对可选表施加任何约束的原因,如 Dave Kelly 的回答所示。

于 2018-03-22T14:13:25.437 回答