ORACLE - 理解 NOT EXISTS 运算符的问题
ORACLE - Problem understanding NOT EXISTS operator
我 运行 编写了一段简单的代码,但从那以后我就一直在绞尽脑汁。
这要么违反直觉,要么我遗漏了一些简单的或基本的东西。不知道。
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
);
排除所有其他条件,基本版本的功能类似于上面的代码。
子查询 return 包含 SomeDate = 14/11/19 的所有行,因为这些行大于第 5 行但严格小于第 28 行。
当行 returned 时,Not Exists 的计算结果应为 false。
所以按照我的逻辑,这意味着排除所有带有 14/11/19 的行,上面的代码应该 return 28/11/19.
但它 return 是“14/11/2019”。
有人可以解释一下我遗漏了什么吗?
非常感谢。
我会这样写查询,这样我可以更轻松地阅读它:
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
匹配此日期。
我怀疑你对子查询中的不等式感到困惑。
我 运行 编写了一段简单的代码,但从那以后我就一直在绞尽脑汁。
这要么违反直觉,要么我遗漏了一些简单的或基本的东西。不知道。
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
);
排除所有其他条件,基本版本的功能类似于上面的代码。
子查询 return 包含 SomeDate = 14/11/19 的所有行,因为这些行大于第 5 行但严格小于第 28 行。
当行 returned 时,Not Exists 的计算结果应为 false。
所以按照我的逻辑,这意味着排除所有带有 14/11/19 的行,上面的代码应该 return 28/11/19.
但它 return 是“14/11/2019”。
有人可以解释一下我遗漏了什么吗?
非常感谢。
我会这样写查询,这样我可以更轻松地阅读它:
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
匹配此日期。
我怀疑你对子查询中的不等式感到困惑。