Я столкнулся с простым кусочком кода, но с тех пор я ломал голову.
Это либо нелогично, либо я что-то упускаю, простое или фундаментальное. Понятия не имею.
WITH T1 AS
(
SELECT TO_DATE ('14/11/19', 'DD/MM/YY') as SomeDate FROM DUAL
UNION
SELECT TO_DATE ('28/11/19', 'DD/MM/YY') as SomeDate FROM DUAL
),
T2 AS
(
SELECT TO_DATE ('14/11/19', 'DD/MM/YY') as SomeDate FROM DUAL
UNION
SELECT TO_DATE ('28/11/19', 'DD/MM/YY') as SomeDate FROM DUAL
)
SELECT * FROM T1 WHERE T1.SomeDate >= TO_DATE ('05/11/19','DD/MM/YY')
AND NOT EXISTS
(SELECT 1 FROM T2
WHERE T2.SomeDate >= TO_DATE ('05/11/19','DD/MM/YY')
AND T2.Somedate < T1.Somedate
);
За исключением всех других условий, базовая версия делает что-то вроде приведенного выше кода.
Подзапрос возвращает все строки, где SomeDate = 14/11/19, так как они являютсяте, которые больше 5-го, но строго ниже 28-го.
И не существует, должны возвращать значение false, когда строки возвращаются.
Итак, по моей логике это означает, что исключение всех строк с14/11/19, приведенный выше код должен вернуть 28/11/19.
Но он возвращает '14 / 11/2019 '. * 10101 *
Может кто-нибудь объяснить, что я пропустил?
Большое спасибо.