考虑这两个类似的SQL
(ON子句中的条件)
select t1.field1, t2.field1 from table1 t1 inner join table2 t2 on t1.id = t2.id and t1.boolfield = 1
(WHERE子句中的条件)
select t1.field1, t2.field1 from table1 t1 inner join table2 t2 on t1.id = t2.id where t1.boolfield = 1
我已经对此进行了一些测试,我可以看到在两个不同位置为外部联接放置条件之间的区别。但是在内部联接的情况下,结果集会有所不同吗?
对于INNER JOIN,没有有效的区别,尽管我认为第二种选择更清洁。
对于LEFT JOIN,有很大的不同。ON子句指定将从表中选择要比较的记录,WHERE子句过滤结果。
示例1:返回tbl 1中的所有行,并将它们与tbl2中boolfield = 1的适当行进行匹配
Select * From tbl1 LEFT JOIN tbl2 on tbl1.id=tbl2.id and tbl2.boolfield=1
示例2:将仅包括tbl1中的行,其中tbl2中具有匹配行且boolfield = 1的行。它联接表,然后过滤掉不符合条件的行。
Select * From tbl1 LEFT JOIN tbl2 on tbl1.id=tbl2.id WHERE tbl2.boolfield=1