我通过更改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 :(得分: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)是过于强烈和错误地过滤掉结果。
答案 1 :(得分:0)
我的问题在于第五个条款
AND (r.start_dte < r.end_dte)
我忘了r.end_dte
可能为空。这给了我奇怪的结果。我把它改成了
AND (r.start_dte < r.end_dte OR r.end_dte is null)