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%'

私の意図は、最初の 2 つの条件のうちの 1 つが満たされ (ランプは今月開始するか、今月終了してフォローアップがない必要があります)、他のすべての条件が満たされることです。私はこれを書いていませんか?

最後から 2 番目の条件に違反する結果が得られているため、正しく機能していないことはわかっていANDます。

4

2 に答える 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

私の問題は、第5節で

AND (r.start_dte < r.end_dte)

r.end_dteそれがnullになる可能性があることを忘れていました。これは私に奇妙な結果をもたらしていました。に変更しました

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