2010-09-01 99 views
2

我對Informix數據庫運行2個查詢。查詢使用內連接和外連接打擊4個不同的表。我認爲他們都應該返回相同的結果集,但我得到了3個記錄差異。這兩個查詢如下所示:Informix查詢異常

查詢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 ..... 

沒有人有任何想法,爲什麼這兩個回報不同的結果集?我認爲通過改變使用內部連接/左外部連接而不是僅使用外部(並且沒有任何內部連接)會返回相同的結果。

回答

2

WHERE子句的內容可能是其中的一個因素。第一種表示法Informix風格的OUTER連接符號是非標準的,並且具有相當特殊的語義(這很禮貌)。第二種表示法是ISO標準的OUTER JOIN,它具有規定的語義。

對於Informix風格的聯接,只存在於WHERE子句中的任何篩選器中存在於其列上的內部聯合對的所有行都將返回結果集中。如果外連接表中的列或內表與外表之間的WHERE子句中存在過濾器,那麼這些過濾器可能會從結果集中消除一些可能的行,但結果的innner連接部分將會仍然顯示爲空值。解釋起來非常複雜。它或多或少有意義,但的結果不僅僅是對基本連接集合的限制的投影。

您能否確認WHERE子句在表格3和表格4的列上包含一些條件?

使用ISO標準OUTER JOIN表示法模擬Informix樣式的OUTER連接並不是一件簡單的方法。

+0

是的,表3和表4中的列有條件。你所解釋的是最肯定發生的事情。我只需要嘗試堅持原始查詢。我是否正確地假設第一個查詢是最正確的? – czuroski 2010-09-01 14:48:30

+0

@czuroski:「第一個查詢最正確嗎?」他們只是不同的問題 - 你需要知道哪一個能產生你需要的答案。考慮到您的應用程序最初是使用Informix風格的連接編寫的,這可能會爲您的應用程序提供正確的結果 - 因此是更好的選擇。但是,您可以修改應用程序以使用ISO(標準)聯接;你可能會稍微改變一下這個查詢,就是這樣。我還沒有計算出是否有辦法通過ISO連接來實現Informix風格的結果,但我知道這不是微不足道的。 – 2010-09-01 16:20:04

+0

我知道這是一箇舊的評論,但我想知道是否可能在條件的放置:在WHERE子句(返回62行)或在'JOIN ... ON'子句中。後者的放置可能會返回相加的3行。 – Menachem 2015-02-11 23:13:29