有人可以向我解释一下吗?
我有两个很大的桌子,我希望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
答案 0 :(得分:1)
来自第一个命名表的左外连接所有行("左" 包括在JOIN子句中最左边的表。 右表中不匹配的行不会出现。
当您将条件移动到where时,则应用t1.Enabled = 1
第一个查询是否存在实际性能问题?