2013-04-02 2 views
2

Я получаю разные результаты, изменяя порядок моих, где условия, но я не понимаю, почему:Должен ли заказ в этом месте где?

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

Смежные вопросы