2

通过更改 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条件。

4

2 回答 2

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) 太强而错误地过滤掉结果。

于 2013-04-02T20:51:11.103 回答
0

我的问题是在第五条

AND (r.start_dte < r.end_dte)

我忘了这r.end_dte可能是空的。这给了我奇怪的结果。我把它改成

AND (r.start_dte < r.end_dte OR r.end_dte is null)
于 2013-04-02T21:04:43.643 回答