2011-04-21 62 views
1

我有2個Informix查詢,我認爲應該返回相同的數據但不要。第一個查詢使用子查詢作爲過濾器,並且不正確地返回任何行。第二個是使用左外連接檢查子查詢中使用的同一列上的null,並正確返回正確的數據集。我錯過了什麼或者這是一個錯誤?2查詢應該返回相同的數據,但不要

select i.invoice_date, oe.commit_no 
    from oe 
    join invoice i 
    on oe.invoice_no = i.invoice_no 
    where i.invoice_date > today - 60 
    and oe.commit_no not in (select commit_no from bolx) 

select i.invoice_date, oe.commit_no, bolx.bol_no 
    from oe 
    join invoice i 
    on oe.invoice_no = i.invoice_no 
    left join bolx 
    on bolx.commit_no = oe.commit_no 
    where i.invoice_date > today - 60 
    and bolx.commit_no is null 

縮模式(這是一個傳統的數據庫,所以它有一些怪癖):

invoice 
    invoice_no char(9), 
    invoice_date date 

oe 
    commit_no decimal(8, 0), 
    invoice_no char(9) 

bolx 
    commit_no decimal(8, 0) 

回答

3

任何時候,我讀到「不是在... ...子查詢不返回行」我我很確定我知道答案!我想select commit_no from bolx返回一些NULL值?

NOT IN中存在NULL可確保不會返回任何結果。

foo NOT IN (bar, NULL)相當於

foo <> bar and foo <> NULL

foo <> NULL部分將始終評估爲unknown,除非所有的條件評價爲trueAND不能計算爲true

+0

情況就是這樣。謝謝。我已將我的應用切換到第二種形式。 – 2011-04-21 23:20:48

+1

這種行爲並不是Informix特有的 - 它適用於任何SQL數據庫。 – 2011-04-25 00:26:36

相關問題