2013-04-02 36 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

相关问题