左连接过滤仅适用于where子句

时间:2016-02-25 07:46:44

标签: tsql

有人可以向我解释一下吗?

我有两个很大的桌子,我希望LEFT JOIN,但我认为过滤在' on'而不是' where'。

Select * from Table1 t1 left join Table2 t2 on t1.Id = t2.Id and t1.Enabled = 1

而不是

Select * from Table1 t1 left join Table2 t2 on t1.Id = t2.Id where t1.Enabled = 1

以上结果不一样。无论我将其作为过滤放入,它都不会受到影响:

Select * from Table1 t1 left join Table2 t2 on t1.Id = t2.Id and t1.Enabled = 1

产生与

完全相同的结果
Select * from Table1 t1 left join Table2 t2 on t1.Id = t2.Id and t1.Enabled = 0

此外,Table1可能只有少数记录,其中Enabled = 1,因此首先连接数百万条记录然后过滤以仅查找10条记录效率低。

我可以先做一个子选择,不过我觉得这不是正确的方法:

Select * from (Select * from Table1 where Enabled = 1) a left join Table2 t2 on a.Id = t2.Id

1 个答案:

答案 0 :(得分:1)

Types of Joins

  

来自第一个命名表的左外连接所有行("左"   包括在JOIN子句中最左边的表。   右表中不匹配的行不会出现。

当您将条件移动到where时,则应用t1.Enabled = 1

第一个查询是否存在实际性能问题?