我正在针对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 .....
有没有人知道为什么这两个会返回不同的结果集?我假设通过更改使用内部联接/左外部联接而不是仅使用外部(并且没有内部联接)将返回相同的结果。
答案 0 :(得分:2)
WHERE子句的内容可能是其中的一个因素。第一种表示法,即Informix样式的OUTER连接符号,是非标准的,并且具有相当特殊的语义(这是礼貌的)。第二种表示法是ISO标准的OUTER JOIN,它规定了语义。
使用Informix样式的连接,内部连接的表对中的所有行都将在结果集中返回,这些表在WHERE子句中仅在其列上的任何过滤器中生效。如果WHERE子句中的外部连接表中的列或内部表和外部表之间存在过滤器,那么这些过滤器可能会从结果集中删除一些可能的行,但结果的内部连接部分将仍然出现空值扩展。解释起来非常复杂。它或多或少都有意义,但结果不仅仅是对基本连接集的限制的预测。
您能否确认WHERE子句包含table3和table4中列的某些条件?
使用ISO标准OUTER JOIN表示法模拟Informix样式的OUTER连接并不是一种简单的方法。