我在一个复合键上连接两个表,我想知道在连接时比较相应列的位置是否重要。
假设我有一个表 TableA,其中包含 ColAFoo、ColAFoo2 和 ColABar 列。TableA 有一个复合主键,包括 ColAFoo 和 ColAFoo2 (PK_TableA)。
我还有 TableB,带有 ColBFoo、ColBFoo2 和 ColBother。TableB 的列 ColBFoo 和 ColBFoo2 包含 TableA 主键 (FK_TableA_TableB) 的外键。
我需要在键上连接两个表。以下三个(非常人为的)陈述在性能方面有区别吗?
SELECT * FROM TableA a JOIN TableB b ON a.ColAFoo = b.ColBFoo AND a.ColAFoo2 = b.ColBFoo2 SELECT * FROM TableA a JOIN TableB b ON a.ColAFoo = b.ColBFoo WHERE a.ColAFoo2 = b.ColBFoo2 -- this one is a little /too/ contrived, apparently (see comments) SELECT * FROM TableA a JOIN TableB b WHERE a.ColAFoo = b.ColBFoo AND a.ColAFoo2 = b.ColBFoo2
对于inner join以下结果,它们是等价的,并且可能会产生相同的查询计划:
inner join
SELECT * FROM TableA a JOIN TableB b ON a.ColAFoo = b.ColBFoo AND a.ColAFoo2 = b.ColBFoo2 SELECT * FROM TableA a JOIN TableB b ON a.ColAFoo = b.ColBFoo WHERE a.ColAFoo2 = b.ColBFoo2 -- SQL89 inner join: SELECT * FROM TableA a, TableB b WHERE a.ColAFoo = b.ColBFoo AND a.ColAFoo2 = b.ColBFoo2
但是, 将连接条件放在ON子句中将与其他程序员交流,“嘿!这是将表关联在一起的条件。” 与where子句中的内容相对,即“连接完成后限制结果的标准”。
ON
此外,使用时,条件的位置在结果上有很大的不同outer join,因此on在所有情况下都应考虑加入联接条件。
outer join
on