ORACLE-理解NOT EXISTS运算符时出现问题



我遇到了一些简单的代码,但从那以后我一直在绞尽脑汁。

这要么违背直觉,要么我错过了一些东西,要么是简单的,要么是基本的。不知道。

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与该日期匹配。

我怀疑你被子查询中的不平等弄糊涂了。

相关内容

  • 没有找到相关文章

最新更新