我遇到了一些简单的代码,但从那以后我一直在绞尽脑汁。
这要么违背直觉,要么我错过了一些东西,要么是简单的,要么是基本的。不知道。
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行。
返回行时,Not Exists的计算结果应为false。
因此,根据我的逻辑,这意味着排除所有具有14/11/19的行,上面的代码应该返回28/11/19。
但它返回"2019年11月14日"。
有人能解释一下我缺了什么吗?
非常感谢。
我会这样写查询,这样我可以更容易地读取它:
WITH T1 AS (
SELECT DATE '2019-11-14' as SomeDate FROM DUAL UNION ALL
SELECT DATE '2019-11-28' as SomeDate FROM DUAL
),
T2 AS (
SELECT DATE '2019-11-14' as SomeDate FROM DUAL UNION ALL
SELECT DATE '2019-11-28' as SomeDate FROM DUAL
)
SELECT *
FROM T1
WHERE T1.SomeDate >= DATE '2019-11-05' AND
NOT EXISTS (SELECT 1
FROM T2
WHERE T2.SomeDate >= DATE '2019-11-05' AND
T2.Somedate < T1.Somedate
);
我不知道你的困惑在哪里。T1.SomeDate
有两种可能性,2019-11-14和2019-11-18。
只有较早的日期(2019-11-14(在T2
中没有小于该日期的行。因此,NOT EXISTS
与该日期匹配。
我怀疑你被子查询中的不平等弄糊涂了。