【问题标题】:Informix query odditiesInformix 查询异常
【发布时间】:2015-02-12 07:27:08
【问题描述】:

我正在对一个 Informix 数据库运行 2 个查询。查询使用内连接和外连接访问 4 个不同的表。我认为它们都应该返回相同的结果集,但我得到了 3 条记录的差异。这两个查询如下所示:

查询 1(返回 65 行)-

 select ...  
    from table1, table2, outer table3, outer table4
   where table1.id = table2.id
     and table1.id = table3.id
     and table1.id = table4.id 
     and .....

查询 2(返回 62 行)-

select ....
from table1 inner join table2 on table1.id = table2.id
left outer join table3 on table1.id = table3.id
left outer join table4 on table1.id = table4.id
where .....

有谁知道为什么这两个返回不同的结果集?我假设通过更改为使用内连接/左外连接而不是仅使用外连接(内连接不使用任何内容)将返回相同的结果。

【问题讨论】:

    标签: informix


    【解决方案1】:

    WHERE 子句的内容可能是其中的一个因素。第一种表示法,Informix 风格的 OUTER 连接表示法,是非标准的,并且具有相当特殊的语义(这是礼貌的)。第二种表示法是具有规定语义的 ISO 标准 OUTER JOIN。

    使用 Informix 样式的联接,内部联接的表对中的所有行在 WHERE 子句中的任何过滤器中幸存的仅在其列上的所有行都将在结果集中返回。如果外连接表中的列上的 WHERE 子句中有过滤器,或者内表和外表之间有过滤器,那么这些过滤器可能会从结果集中消除一些可能的行,但结果的内连接部分将仍然出现空值扩展。解释起来极其复杂。这或多或少有点道理,但结果不仅仅是对基本连接集的限制的投影

    您能否确认 WHERE 子句在 table3 和 table4 的列上包含一些条件?

    没有一种简单的方法可以使用 ISO 标准 OUTER JOIN 表示法模拟 Informix 样式的 OUTER 联接。

    【讨论】:

    • 是的,table3和table4的列都有条件。你所解释的肯定正在发生。我将不得不尝试坚持原来的查询。我是否正确假设第一个查询是最正确的?
    • @czuroski:“第一个查询最正确吗?”它们只是不同的查询 - 您需要知道哪一个会产生您需要的答案。鉴于您的应用程序最初是使用 Informix 样式的连接编写的,这可能会为您的应用程序提供正确的结果 - 因此是更好的选择。但是,您可以修改您的应用程序以使用 ISO(标准)连接;您可能会稍微改变一下查询的措辞,仅此而已。我还没有弄清楚是否有一种方法可以通过 ISO 连接实现 Informix 样式的结果,但我知道这不是微不足道的。
    • 我知道这是一条旧评论,但我想知道差异是否可能在于条件的放置:在 WHERE 子句中(返回 62 行)或 JOIN...ON条款。后一个位置可能会返回额外的 3 行。
    • @Menachem:当然,旧式表示法不能在 FROM 子句中包含连接条件。新式表示法可以在 ON 子句中包含过滤条件而不是严格的连接条件。通过仔细定位过滤条件来模拟旧式表示法可能是可能的——我没有花大量时间考虑它(但这显然是一种可能性)。第一个问题是提出一些说明差异的数据。接下来就是玩它了。
    • 我确实有一篇关于旧式连接的古代(1987 年左右)文章,以及关于旧式连接的一些古代(ISQL 2.10 或左右)手册(附录)的转录样式连接。我可以挖掘这些数据,然后有人可以使用示例数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 2011-04-21
    • 2018-04-07
    • 2018-07-12
    • 2011-11-20
    相关资源
    最近更新 更多