2013-04-02 68 views
2

我改變我的WHERE條件的順序得到不同的結果,但我不明白爲什麼:應該在這個where子句中考慮順序嗎?

SELECT 
    ... 

WHERE (
    -- Ramps that start this month 
    (r.start_dte > ? AND r.start_dte <= ?) 

    OR 

    -- Ramps that end this month and have no follow-up. 
    (r.end_dte >= ? AND r.end_dte <= ? AND r.id = m.latestId) 
) 

-- Throw out expired schedules or contracts 
AND (s.term_dte > r.start_dte or s.term_dte is null) 
AND (c.term_dte > r.start_dte or c.term_dte is null) 

-- Throw out a ramp if its end date is before its start date 
AND (r.end_dte > r.start_dte) 

AND s.name not like '%zz%' 

我的本意是前兩個條件之一得到滿足(斜坡必須或者本月開始或本月結束&無後續行動),並滿足其他所有條件。我沒有寫過嗎?

我知道事情工作不正常,因爲我得到的結果違反倒數第二個AND條件。

+0

您的第二個和倒數第二個子句是衝突的。爲什麼說(A或B)然後說(A)?其中A是s.term_dte> r.start_dte。 – Lukos

+0

對不起,我的意思是r.end_dte。倒數第二個句子說,只得到結束日期在開始日期之後的坡道。第二條款規定,只能獲得結束日期落在時間範圍之間的坡道。我認爲他們沒有衝突。 –

回答

0

我的問題是,第五條

AND (r.start_dte < r.end_dte) 

在我忘了r.end_dte可能爲空。這給了我奇怪的結果。我將其更改爲

AND (r.start_dte < r.end_dte OR r.end_dte is null) 
2

關於您的第一個問題:是的,對我來說,您的查詢在您的規範方面看起來是正確的。

關於第二個問題,我建議重寫你的條件,他們遵守對數的在線訂購(在左側較小的日期/值):

... 
WHERE (
    -- Ramps that start this month 
    (? < r.start_dte AND r.start_dte <= ?) 

    OR 

    -- Ramps that end this month and have no follow-up. 
    (? <= r.end_dte AND r.end_dte <= ? AND r.id = m.latestId) 
) 

-- Throw out expired schedules or contracts 
AND (r.start_dte < s.term_dte or s.term_dte is null) -- condition (3) 
AND (r.start_dte < c.term_dte or c.term_dte is null) 

-- Throw out a ramp if its end date is before its start date 
AND (r.start_dte < s.term_dte) -- condition (5) 

AND s.name not like '%zz%' 

現在你可以看到,條件(3)弱於條件(5),因此或者(3)是多餘的並且可以省略(5)太強並且錯誤地過濾掉結果。

+0

我輸錯了,條件(5)是'r.start_dte

+0

我想通了,但感謝您的號碼線訂購建議。它使事情更清晰。 –

+0

當然,不客氣:) – Marcellus

相關問題