gpt4 book ai didi

database - 在 Informix 中使用 ANSI OUTER JOIN 和 OUTER 时查询计划的差异

转载 作者:搜寻专家 更新时间:2023-10-30 20:20:36 33 4
gpt4 key购买 nike

使用 ANSI 语法的 Informix 查询性能是否有差异:

SELECT .. 
LEFT OUTER JOIN some_table ON (<condition>)
LEFT OUTER JOIN some_other_table (<condition_on_some_table>)

和 Informix 特定的 OUTER 语法:

SELECT ... 
OUTER (some_table,
OUTER(some_other_table))
WHERE <join_conditions>

谢谢

最佳答案

是的,标准外连接和 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 保留了下来。标准连接执行外部连接,然后过滤结果。

关于database - 在 Informix 中使用 ANSI OUTER JOIN 和 OUTER 时查询计划的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8243336/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com