admin

在SQL Server中联接两个表时,在哪里检查组合键的一部分有关系吗?

sql

我在一个复合键上连接两个表,我想知道在连接时比较相应列的位置是否重要。

假设我有一个表 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

阅读 175

收藏
2021-07-01

共1个答案

admin

对于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子句中的内容相对,即“连接完成后限制结果的标准”。

此外,使用时,条件的位置在结果上有很大的不同outer join,因此on在所有情况下都应考虑加入联接条件。

2021-07-01