对于这样的内部联接,它们在逻辑上是等效的。但是,您可能会遇到join子句中的条件与where子句中的条件含义不同的情况。
举一个简单的例子,假设您像这样进行左连接;
select x.idfrom x left join y on x.id = y.id;
在这里,我们将获取x中的所有行,而不管y中是否有匹配的id。现在说我们的加入条件增加了-
我们不仅在基于id的y中寻找匹配项,而且还在基于id_type的中寻找匹配项。
select x.idfrom x left join y on x.id = y.id and y.id_type = 'some type';
同样,这将给出x中的所有行,而不管y中是否存在匹配的(id,id_type)。
但是,这是非常不同的:
select x.idfrom x left join y on x.id = y.idwhere y.id_type = 'some type';
在这种情况下,我们将选择x的所有行,并尝试匹配y的行。现在,对于y中不匹配的行,y.id_type将为null。因此,不满足y.id_type =’some
type’的要求,因此将那些不匹配的行丢弃,从而有效地将其转换为内部联接。
长话短说:对于内部联接来说,条件在哪里都无关紧要,对于外部联接则可以。



