是的,标准外连接和 Informix 样式外连接的语义存在差异,这不可避免地意味着查询计划存在差异。
一般来说,对任何新的或修改过的代码使用标准表示法 - 为(未更改的)遗留代码保留 Informix 样式的外部连接表示法,并且最好更新它以使用新的连接表示法。
有什么区别?公平的问题 - 很难解释,也更难想出一个好的(似是而非的例子)。基本上,Informix 样式表示法会保留“主要”表(非外部表)中的行,即使存在基于外部联接表中的值的条件会拒绝这些行。
这两个查询产生相同的结果:
SELECT i.*, o.*
FROM DominantTable AS i, OUTER OuterJoinedTable AS o
WHERE i.pk_column = o.fk_column;
SELECT i.*, o.*
FROM DominantTable AS i
LEFT OUTER JOIN OuterJoinedTable AS o
ON i.pk_column = o.fk_column;
这两个查询不一定产生相同的结果:
SELECT i.*, o.*
FROM DominantTable AS i, OUTER OuterJoinedTable AS o
WHERE i.pk_column = o.fk_column
AND (o.alt_column IS NULL OR o.alt_column = 1);
SELECT i.*, o.*
FROM DominantTable AS i
LEFT OUTER JOIN OuterJoinedTable AS o
ON i.pk_column = o.fk_column
WHERE (o.alt_column IS NULL OR o.alt_column = 1);
区别出现在这样的情况下:
DominantTable OuterJoinedTable
pk_column other_column fk_column alt_column
1 twenty 1 3
标准的 LEFT OUTER JOIN 表示法将产生空集作为结果。 Informix 样式的连接将产生结果:
pk_column other_column fk_column alt_column
1 twenty null null
DominantTable 中的数据没有因为主表上的过滤条件而被拒绝,因此它由 Informix 保留。标准联接执行外部联接,然后过滤结果。